【SQL】資料分組與條件篩選:GROUP BY, HAVING 用法教學

  • Post author:
Home » 莫非工具 » SQL » 【SQL】資料分組與條件篩選:GROUP BY, HAVING 用法教學

之前在Google Sheet試算表這篇文章中,我們提到了聚集函數(aggregation function)的概念,常見的聚集函數像是SUM (), AVG(), COUNT() 等等,以及GROUP BY 的用法。

今天的主題我們依然會圍繞著GROUP BY語句,只不過是從SQL寫法的角度。另外,如果遇到使用GROUP BY但是有限制條件的情況,就會使用HAVING語句

下面讓我們來一步一步介紹吧!


GROUP BY 邏輯講解

如開頭提到的,GROUP BY 語句在SQL中會搭配聚集函數使用,不過這是什麼意思呢?讓我用更白化的方式舉例說明:

user_idproduct_idamount
112310
24565
37891
41232
14563
17898
item 表

上面你可以看到每個不同的用戶(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_idtotal_amount
121
25
31
42
result

你會發現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_idtotal_amount
121
25
result

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用法,大家都學會了嗎?我們下期文章再見囉!

Murphy

我是Murphy,是一名職場人。這裡主要分享職場問題、職場話題、求職資訊,還有那些我所熱愛的事物。

歡迎留言,與我們分享你的看法!