レッスン 4

GROUP BY と集約

COUNT、SUM、GROUP BY、HAVING、日付バケットで行を要約します。

集約は多くの行を要約行に変えます。すべての注文を返す代わりに、ステータスごとに注文数を数えられます。

SELECT status, COUNT(*) AS order_count
FROM orders
GROUP BY status
ORDER BY order_count DESC;

GROUP BY は結果の粒度を決めます。status でグループ化すると、ステータスごとに 1 行です。status, user_id でグループ化すると、ステータスとユーザーの組み合わせごとに 1 行です。

WHERE と HAVING

グループ化前に生の行をフィルタするには WHERE を使います。

WHERE created_at >= '2026-01-01'

グループ化後に集約結果をフィルタするには HAVING を使います。

HAVING COUNT(*) > 10

レポートが間違って見えるときは、フィルタが集約の前か後かに属するかを確認してください。

日付バケットは方言依存

レポートクエリは日、週、月でグループ化することが多いです。各データベースには異なる日付関数があります。PostgreSQL は date_trunc を使うことが多く、MySQL と SQLite は別の関数を使います。

これが SQL Formatter が方言選択を公開する理由の一つです。言語ファミリが分かると、一般的な構造をよりよく扱えます。

要点

集約数値を読む前に、粒度を特定します。1 行は何に対応するか? 多くの集約バグは、グループ化が広すぎる、狭すぎる、または間違った段階でフィルタしていることから来ます。

SQL Formatter で集約クエリを整形し、どの列が結果の粒度を定義するかをマークしてください。

実践したいときは関連する DevCove ツールを使えます。任意であり、このレッスンの必須部分ではありません。

関連ツールを開く

コース概要へ戻る