SQLの学習を進める中で、「集計の書き方が分からない」「GROUP BYの使い方が混乱する」と感じる場面は非常に多いです。本記事では、塾生の来塾データを例にして、誰がどこに何回訪問したか、月ごとの訪問回数をどう考えればよいかを整理して解説します。
まずSQL集計の基本:GROUP BYの考え方
SQLの集計は「同じグループをまとめて数える」という発想が基本になります。
例えば「名前ごと」「場所ごと」にまとめて、その中の件数を数えるのがGROUP BYです。
今回のデータでは「田中×A市」「田中×B市」のように組み合わせ単位で集計する必要があります。
① 誰がどの市に何回訪問したかのSQL
この問題は「名前」と「来塾場所」の2つをセットでグループ化するのがポイントです。
正しいSQLの考え方は以下の通りです。
SELECT 名前, 来塾場所, COUNT(*) AS 回数 FROM 塾生リスト GROUP BY 名前, 来塾場所;
ここで重要なのは「COUNT(回数)」ではなく「COUNT(*)」を使う点と、GROUP BYに2つの列を指定する点です。
② 月ごとの訪問回数を集計するSQLの考え方
月別集計は「日付から月を取り出す」という処理が必要になります。
SQLでは通常、DATE_FORMATやEXTRACTなどを使って月単位に変換します。
SELECT 名前, EXTRACT(MONTH FROM 来塾日) AS 月, COUNT(*) AS 回数 FROM 塾生リスト GROUP BY 名前, EXTRACT(MONTH FROM 来塾日);
この結果をさらにピボット(横持ち変換)することで「1月〜12月の表」にできます。
月別を横並びにするピボットの考え方
SQL初心者がつまずきやすいのが「縦の結果を横にする」部分です。
これはCASE文を使って月ごとに条件分岐することで実現できます。
SELECT 名前, SUM(CASE WHEN EXTRACT(MONTH FROM 来塾日)=1 THEN 1 ELSE 0 END) AS “1月” FROM 塾生リスト GROUP BY 名前;
SQLが難しく感じる理由と考え方のコツ
SQLは「日本語のまま書こうとする」と混乱しやすい特徴があります。
まずは「どの単位でまとめるか(グループ)」を決めるのが最優先です。
その後に「何を数えるか(COUNT)」を考えると整理しやすくなります。
よくある間違いパターン
初心者の多くはWHEREで月ごとに分けようとしてしまいますが、それは非効率です。
またGROUP BYに必要な列を入れ忘れるとエラーになります。
SQLは「集計対象」と「グループ条件」を必ずセットで考えることが重要です。
まとめ
今回のポイントは「GROUP BYで単位を決める」「日付は月に変換する」「縦結果はCASEで横展開する」という3点です。
SQLは最初は複雑に見えますが、考え方の型を覚えると一気に理解しやすくなります。
小さな例で繰り返し練習することが上達の近道です。

コメント