SQL設計・ウィンドウ関数・関係代数 重要度:★★★出題: AM2・PM1・PM2
集合関数・GROUP BY・HAVING句とCASE式による条件付き集計
しゅうごうかんすうぐるーぷばいはびんぐくとけーすしき / GROUP BY, HAVING & Conditional Aggregation with CASE
指定列の値ごとにグループ化して集合関数を適用するGROUP BY句、グループ化後の集計結果に条件を課すHAVING句、およびCASE式を組み合わせて1回の走査で行・列変換や条件別集計を行う技法。
3行速習ポイント
- SQLの論理的な評価順序は `FROM/JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY` である
- 集合関数(COUNT(*)を除くSUM, AVG, MAX, MIN, COUNT(列名))はすべてNULL値を無視して計算を行い、対象行がすべてNULLの場合はNULLを返す(COUNTは0)
- `SUM(CASE WHEN 入退室区分 = 'I' THEN 1 ELSE 0 END)` のように集合関数の中にCASE式を入れることで、区分別の件数や金額を1行に横展開して集計できる
図解
図SQL文の論理的評価順序と条件付き集計
11. FROM / JOIN → WHERE
Row Filter結合後にグループ化前の個々の行をWHERE条件で絞り込む
22. GROUP BY → HAVING
Group Filter指定列でグループ化し、集合関数の結果に対してHAVING条件で絞り込む
33. SELECT (SUM + CASE式) → ORDER BY
Pivot AggregateSUM(CASE WHEN ... THEN 1 ELSE 0 END) で区分別件数を1行に横展開
概要と本質
午後I・午後IIのSQL穴埋め問題でほぼ毎回出題される頻出パターンです(令和6年午後I問2の入退室区分集計など)。特に `SUM(CASE WHEN 条件 THEN 値 ELSE 0 END)` または `COUNT(CASE WHEN 条件 THEN 1 ELSE NULL END)` のイディオムは必須知識です。
重要ポイント・コア概念
- GROUP BY句に指定していない列は、集合関数の引数にする場合を除き、SELECT句やHAVING句に直接記述できない
- WHERE句はグループ化前の「個々の行」を絞り込み、HAVING句はグループ化後の「グループ(集合関数の結果等)」を絞り込む
- COUNT(CASE WHEN 条件 THEN 1 END) ではELSE句を省略(暗黙のNULL)にすることで、条件に合致する行だけをカウントできる(ELSE 0にすると0も非NULLとしてカウントされてしまうため注意!)
午後I・午後II記述試験での攻略ポイント
午後IのSQL穴埋めで `CASE WHEN [ b ] THEN 1 ELSE -1 END` の外側に `[ a ](...)` があったら、`SUM` と `COUNT` の違いに注意してください。1と-1や数量を足し引きする場合は必ず `SUM` を使います(`COUNT` だと非NULL行の個数を数えるだけになってしまいます)。
午後記述で使える加点キーワード(クリックでコピー)
この用語が出題された過去問を解く(1分演習)
即時アウトプットで定着データベーススペシャリスト 過去問演習で実践力を鍛える