レッスン 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 で集約クエリを整形し、どの列が結果の粒度を定義するかをマークしてください。