之前在 Google Sheet 試算表這篇文章中,我們提到了聚集函數 (aggregation function) 的概念,像是 SUM (), AVG(), COUNT(),以及介紹 GROUP BY 的用法。
今天的主題依然會圍繞著 GROUP BY 語句,只不過是從 SQL 的角度出發。而在使用 GROUP BY 語句若想限制條件,還可以搭配 HAVING 語句使用
下面讓我們來一步一步介紹吧!
GROUP BY 邏輯講解
如開頭提到的,GROUP BY 語句在 SQL 中會搭配聚集函數使用,這是什麼意思呢?
讓我用比較白話的方式舉例:下面是每位用戶 (user_id) 所對應的購買產品 (product_id) 與購買數量。其中 1 號用戶,他共買了三個不同的產品,product_id 分別是 123, 456, 789。
user_id | product_id | amount |
1 | 123 | 10 |
2 | 456 | 5 |
3 | 789 | 1 |
4 | 123 | 2 |
1 | 456 | 3 |
1 | 789 | 8 |
由於 1 號用戶在表中出現 3 筆資料,如果你要計算總數,就需要使用 SUM & GROUP BY 將他們聚集起來。
GROUP BY 語法
SELECT column_name(s), aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name1, column_name2...;
GROUP BY 範例
相同的範例中,如果我們想從 item 表抓取每位用戶購買的商品數量,SQL 該怎麼寫呢?
SELECT
user_id
, SUM(amount) total_amount
FROM item
GROUP BY user_id -- 代表按照每個用戶分群,也可寫成GROUP BY 1
按照這樣的寫法,結果會跑出:
user_id | total_amount |
1 | 21 |
2 | 5 |
3 | 1 |
4 | 2 |
你會發現 user_id 不會出現重複用戶,同時 total_amount 出現的是商品數加總(因為我們下了SUM())。
GROUP BY + HAVING 限制條件
接下來,如果我們希望只跑出購買商品數大於 3 的用戶資料,該怎麼做呢?這時就需要使用 HAVING語句。
HAVING 語句的概念跟 WHERE 語句一樣,都是用來限制條件。不過當你使用 GROUP BY 時,限制條件得搭配 HAVING 使用,無法使用 WHERE 來替代,如下:
SELECT
user_id
, SUM(amount) total_amount
FROM item
GROUP BY 1
HAVING SUM(amount) > 3
跑出的資料就會變成:
user_id | total_amount |
1 | 21 |
2 | 5 |
GROUP BY + ORDER BY 排序
如果你想看每位用戶購買產品的總數,並由小到大排序,這時候你就需要使用 GROUP BY + ORDER BY 的功能。
ORDER BY 顧名思義就是「排序」,你可以:
- ORDER BY 某欄位 ASC:由小到大
- ORDER BY 某欄位 DESC:由大到大小
沒有特別寫 ASC 或 DESC,會直接默認由大到小的順序。因此,若按照購買的產品總數由小到大排序,需要寫成:
SELECT
user_id
, SUM(amount) total_amount
FROM item
GROUP BY 1
ORDER BY 2 -- 2指的就是SUM(amount)
以上是常見的 SQL GROUP BY 用法,大家都學會了嗎?我們下期文章再見囉!