01 / 05
集計した数で絞りたい
お店ごとの合計は出せた。じゃあ「合計が18個以上のお店だけ」を出したいときはどう書く?
WHERE に書きたくなるけれど、それはできない。WHERE が働く時点では、まだ合計は計算されていないんだ。
SELECT stall, SUM(sold) FROM sales WHERE SUM(sold) >= 18 GROUP BY stall;実行結果
エラー: misuse of aggregate: SUM()
集める・数える
INPUT · スライド
01 / 05
お店ごとの合計は出せた。じゃあ「合計が18個以上のお店だけ」を出したいときはどう書く?
WHERE に書きたくなるけれど、それはできない。WHERE が働く時点では、まだ合計は計算されていないんだ。
SELECT stall, SUM(sold) FROM sales WHERE SUM(sold) >= 18 GROUP BY stall;実行結果
エラー: misuse of aggregate: SUM()
02 / 05
集計したあとの結果を絞るのが HAVING。GROUP BY のうしろに書くよ。
読み方は「stall でまとめて、合計が18以上のグループだけ持ってきて」。ゆらり工房は合計6なので落ちたね。
SELECT stall, SUM(sold) FROM sales GROUP BY stall HAVING SUM(sold) >= 18;実行結果
こもれび堂 | 18 つむぎ雑貨 | 24
03 / 05
書ける条件も、効くタイミングもちがう。
WHERE … まとめる前。1行ずつを見て残すか決めるHAVING … まとめたあと。グループごとの集計結果を見て残すか決める「値段が600円以上の記録」は WHERE、「合計が1万円以上の店」は HAVING。どっちを見て判断しているかで選ぶよ。
SELECT stall, COUNT(*) FROM sales GROUP BY stall HAVING COUNT(*) >= 3;実行結果
こもれび堂 | 3 つむぎ雑貨 | 3
04 / 05
1つのクエリに WHERE と HAVING を両方書ける。順番はこう決まっているよ。
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
下の例は「600円以上の品だけを対象に、売り上げ合計が9000円以上のお店」。2つのふるいが別のタイミングで働いているんだ。
SELECT stall, SUM(price * sold) FROM sales WHERE price >= 600 GROUP BY stall HAVING SUM(price * sold) >= 9000;実行結果
つむぎ雑貨 | 21000 ゆらり工房 | 9600
05 / 05
HAVING で残したグループを ORDER BY で並べれば、「条件を満たすお店のランキング」になる。
これで集計の道具はひととおりそろったよ。次は章のまとめとして、全部を組み合わせて解いていこう。ここから書いてみよう。
SELECT stall, SUM(sold) FROM sales GROUP BY stall HAVING SUM(sold) >= 18 ORDER BY SUM(sold) DESC;実行結果
つむぎ雑貨 | 24 こもれび堂 | 18