集める・数える

INPUT · スライド

絞ってからまとめる

01 / 05

一部の行だけでまとめたい

「1000円以下の品にしぼって、お店ごとの売れた数を見たい」。絞り込みとグループ化を同時に使う場面だよ。

どちらも書ける。問題はどっちが先に効くかだね。

02 / 05

`WHERE` は `GROUP BY` の前

書く順番は FROMWHEREGROUP BYORDER BY。今まで覚えた場所のまま、うしろに GROUP BY が入るだけだよ。

そして効く順番も同じ。先に行を絞って、残った行だけをグループに分けるんだ。

SELECT stall, SUM(sold) FROM sales  WHERE price <= 1000  GROUP BY stall;

実行結果

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

03 / 05

グループごと消えることがある

上の結果、お店が2つしかないことに気づいた? ゆらり工房の品は1200円と2400円だから、WHERE の段階で全部の行が消えたんだ。

行が1つも残らなかったグループは、結果にも出てこない。「0」ではなく行そのものがないよ。

04 / 05

3段の流れで考える

クエリはこの順に動いていると考えると迷わないよ。

  • 絞るWHERE が行を残す
  • 分けるGROUP BY がグループを作る
  • まとめる … 集計関数がグループごとに1つの値にする

だから WHERE の条件に集計関数は書けない。絞る時点では、まだ合計は計算されていないんだ。

SELECT stall, AVG(price) FROM sales  WHERE day = '2026-05-03'  GROUP BY stall;

実行結果

こもれび堂 | 700
つむぎ雑貨 | 750
ゆらり工房 | 1200

05 / 05

並べ替えはいちばんあと

ORDER BY は最後。まとめ終わった表を並べる係だから、集計関数を書いても大丈夫だよ。

WHEREGROUP BYORDER BY の3つがそろうと、だいぶ本格的なクエリに見えてくるね。ここから書いてみよう。

SELECT stall, SUM(sold) FROM sales  WHERE price >= 600  GROUP BY stall  ORDER BY SUM(sold) DESC;

実行結果

つむぎ雑貨 | 24
こもれび堂 | 9
ゆらり工房 | 6