GROUP BYでエラーになる理由と直し方(「何を1行にしたいか」から逆算)
この記事で分かること
GROUP BYのエラーが出る典型パターンと、直す手順が分かる- 「集計の単位」を日本語で決めてからSQLに落とすコツが身につく
- 集計後にJOINして行が増える事故を避けられる
結論:最初に「最終的に1行を何にするか」を決める
GROUP BY は「どの単位で1行に潰すか」を決める構文です。先に日本語で決めると、GROUP BY
に入れる列が自然に決まります。
最小例:顧客ごとの注文数
SELECT
customer_id,
COUNT(*) AS cnt
FROM
orders
GROUP BY
customer_id;
典型エラー1:GROUP BYにない列をSELECTしている
症状
- 「この列はGROUP BYに含まれていない」系のエラー
直し方
- その列を GROUP BYに追加する(=粒度を変える)
- もしくは 集計関数をかける(
MAXなど) - あるいは、別クエリに分ける(まず集計→後でJOIN)
典型エラー2:意図と違う集計になっている(行が増える)
原因
- 集計前にJOINして、1対多の「多側」を結合してしまっている
回避策
- 先に集計で粒度を揃える→必要なら後でJOINする
練習問題(2問)
- 「日付ごとの注文数」を集計する(
ordered_atは日付に丸める想定) - 「顧客ごとの売上合計」を集計する(
SUM(total))
