GROUP BY 與聚合函數(SUM、COUNT、MAX、MIN、AVG)配合,將明細數據按維度彙總。
SELECT 列表中**未包裹聚合函數的列,必須出現在 GROUP BY 子句中**。
否則會產生「一對多」歧義:分組鍵相同而非聚合列取值不同,數據庫無法決定返回哪一行。
-- Store_Information 表
store_name | Sales | Date
Los Angeles | 1500 | Jan-05-1999
San Diego | 250 | Jan-07-1999
Los Angeles | 300 | Jan-08-1999
Boston | 700 | Jan-08-1999
SELECT store_name, SUM(Sales)
FROM Store_Information
GROUP BY store_name;
結果:
Los Angeles | 1800
San Diego | 250
Boston | 700
| 錯誤寫法 | 問題 | 修正 |
|---|---|---|
SELECT A, B FROM t GROUP BY A | B 未聚合且不在 GROUP BY | SELECT A, COUNT(B) FROM t GROUP BY A 或 SELECT A, MAX(B) ... |
SELECT A, B, SUM(C) FROM t GROUP BY A | B 歧義 | GROUP BY A, B 或聚合 B |
SELECT store_name, DATE_FORMAT(Date, '%Y-%m') AS month, SUM(Sales)
FROM Store_Information
GROUP BY store_name, month
HAVING SUM(Sales) > 1000;
掌握「非聚合列必入 GROUP BY」鐵律,即可避開 90% 分組查詢陷阱。