集める・数える

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` の形

集計したあとの結果を絞るのが HAVINGGROUP BY のうしろに書くよ。

読み方は「stall でまとめて、合計が18以上のグループだけ持ってきて」。ゆらり工房は合計6なので落ちたね。

SELECT stall, SUM(sold) FROM sales  GROUP BY stall  HAVING SUM(sold) >= 18;

実行結果

こもれび堂 | 18
つむぎ雑貨 | 24

03 / 05

`WHERE` と `HAVING` のちがい

書ける条件も、効くタイミングもちがう。

  • WHERE … まとめる前。1行ずつを見て残すか決める
  • HAVING … まとめたあと。グループごとの集計結果を見て残すか決める

「値段が600円以上の記録」は WHERE、「合計が1万円以上の店」は HAVINGどっちを見て判断しているかで選ぶよ。

SELECT stall, COUNT(*) FROM sales  GROUP BY stall  HAVING COUNT(*) >= 3;

実行結果

こもれび堂 | 3
つむぎ雑貨 | 3

04 / 05

両方まぜて書ける

1つのクエリに WHEREHAVING を両方書ける。順番はこう決まっているよ。

SELECTFROMWHEREGROUP BYHAVINGORDER BYLIMIT

下の例は「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