在你還沒被 SQL 語法和變數搞混之前,先記住:聚合函數就是你在統計各種東西時的好夥伴。它們可以幫你算總數、平均值,還能在一堆資料裡做出各種魔法。
聚合函數就是拿來對一群資料列做數學運算的。最常用的有:
SUM():計算數值的總和。AVG():算平均值。COUNT():算出查詢結果有幾筆資料。
聚合函數超級適合你在處理大量資料時,想要快速得到重點報表:像是你有幾張訂單、總金額多少,或是今天最大的一筆消費是多少。 來看看幾個常用的聚合函數吧。
計算資料列數量:COUNT() 函數
COUNT() 這個函數可以幫你算出資料表裡有幾筆資料。來看幾個例子。
-- 簡單計算訂單表裡的所有資料筆數
SELECT COUNT(*) AS total_orders
FROM orders;
-- 計算不重複的客戶數量
SELECT COUNT(DISTINCT customer_id) AS unique_customers
FROM orders;
-- 計算金額大於 100 的訂單數量
SELECT COUNT(*) AS high_value_orders
FROM orders
WHERE total_amount > 100;
COUNT() 很常用來算資料筆數、獨特值,或是搭配條件過濾,比如「有多少學生報名了 Python 課程」。
加總資料:SUM() 函數
SUM() 這個函數會把某個欄位的數值全部加起來。來算算所有客戶的購買總金額吧。
-- 計算總營收
SELECT SUM(total_amount) AS total_revenue
FROM orders;
-- 計算某個客戶的總消費
SELECT SUM(total_amount) AS customer_spending
FROM orders
WHERE customer_id = 101;
-- 依照分類計算訂單總金額
SELECT category, SUM(total_amount) AS category_revenue
FROM orders
GROUP BY category;
SUM() 是你分析銷售、營收或任何總和時的主力工具。比如你想知道商辦大樓上個月的收入?超簡單。
平均值:AVG() 函數
AVG() 可以幫你算出一堆資料的平均值。像是學生的平均分數,或是客戶的平均消費金額。
-- 計算訂單的平均金額
SELECT AVG(total_amount) AS average_order_value
FROM orders;
-- 依照分類計算訂單平均金額
SELECT category, AVG(total_amount) AS average_order_value
FROM orders
GROUP BY category;
-- 計算最近 7 天客戶的平均消費
SELECT AVG(total_amount) AS avg_check_last_week
FROM orders
WHERE order_date >= NOW() - INTERVAL '7 days';
平均值很適合用來分析服務品質、找出異常,或是算出像「每個客戶平均帶來多少利潤」這種關鍵指標。
聚合函數在分析裡的應用
現在你已經認識這些基本函數了,來看看怎麼用它們做出基本的分析報表。
範例 1:總營收和訂單數量
假設你想知道這個月有多少訂單,總共賺了多少錢。
SELECT
COUNT(*) AS total_orders,
SUM(total_amount) AS total_revenue
FROM orders
WHERE order_date >= '2023-10-01' AND order_date <= '2023-10-31';
範例 2:依分類計算平均營收
如果你想要把營收依照商品分類來拆開看呢?
SELECT
category,
COUNT(*) AS total_orders,
SUM(total_amount) AS total_revenue,
AVG(total_amount) AS avg_order_value
FROM orders
GROUP BY category;
範例 3:最近 7 天的訂單
有時候你會想分析短期的數據,比如最近一週的狀況。
SELECT
COUNT(*) AS orders_last_week,
SUM(total_amount) AS revenue_last_week,
AVG(total_amount) AS avg_check_last_week
FROM orders
WHERE order_date >= NOW() - INTERVAL '7 days';
實戰案例與具體任務
任務:依地區分析銷售
假設你是連鎖店老闆,想要分析各地區的營收分布。
SELECT
region,
COUNT(*) AS total_orders,
SUM(total_amount) AS total_revenue,
AVG(total_amount) AS average_order_value
FROM orders
GROUP BY region
ORDER BY total_revenue DESC;
任務:營收前 10 名的客戶
現在來點進階的,找出總消費金額前 10 名的客戶。
SELECT
customer_id,
SUM(total_amount) AS total_spending
FROM orders
GROUP BY customer_id
ORDER BY total_spending DESC
LIMIT 10;
任務:比較每週不同天的營收
想知道你生意哪一天最賺嗎?來看個例子:
SELECT
TO_CHAR(order_date, 'Day') AS day_of_week,
SUM(total_amount) AS total_revenue,
AVG(total_amount) AS avg_order_value
FROM orders
GROUP BY TO_CHAR(order_date, 'Day')
ORDER BY total_revenue DESC;
GO TO FULL VERSION