之前在Google Sheet試算表這篇文章中,我們提到了聚集函數(aggregation function)的概念,常見的聚集函數像是SUM (), AVG(), COUNT() 等等,以及GROUP BY 的用法。
今天的主題我們依然會圍繞著GROUP BY語句,只不過是從SQL寫法的角度。另外,如果遇到使用GROUP BY但是有限制條件的情況,就會使用HAVING語句。
下面讓我們來一步一步介紹吧!
GROUP BY 邏輯講解
如開頭提到的,GROUP BY 語句在SQL中會搭配聚集函數使用,不過這是什麼意思呢?讓我用更白化的方式舉例說明:
user_id | product_id | amount |
1 | 123 | 10 |
2 | 456 | 5 |
3 | 789 | 1 |
4 | 123 | 2 |
1 | 456 | 3 |
1 | 789 | 8 |
上面你可以看到每個不同的用戶(user_id),所對應的購買產品(product_id)跟購買的數量。其中1號用戶,他共買了不同的三樣產品,product_id分別是123, 456, 789。
因為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使用,如下:
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:由大到大小
- ORDER BY 某欄位:默認是由大到小的順序
因此,如果我們想按照購買的產品總數由小到大排序,需要寫成:
SELECT
user_id
, SUM(amount) total_amount
FROM item
GROUP BY 1
ORDER BY 2 -- 2指的就是SUM(amount)
以上是常見的SQL GROUP BY用法,大家都學會了嗎?我們下期文章再見囉!