【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_id) 所對應的購買產品 (product_id) 與購買數量。其中 1 號用戶,他共買了三個不同的產品,product_id 分別是 123, 456, 789。

user_idproduct_idamount
112310
24565
37891
41232
14563
17898
item 表

由於 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 使用,無法使用 WHERE 來替代,如下:

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:由大到大小

沒有特別寫 ASC 或 DESC,會直接默認由大到小的順序。因此,若按照購買的產品總數由小到大排序,需要寫成:

SELECT 
  user_id
  , SUM(amount) total_amount
FROM item
GROUP BY 1
ORDER BY 2 -- 2指的就是SUM(amount)

以上是常見的 SQL GROUP BY 用法,大家都學會了嗎?我們下期文章再見囉!

Murphy

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

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