SQL Server 入門 SQL Server 入門

ホーム > SQL の基本 > GROUP BY でグルーピングして集計する

GROUP BY でグルーピングして集計する

グループごとに集計してみよう

前回の 「 T-SQL の集計関数を使う 2 」 では、 WHERE 句で TestID = 1 のように指定してから、平均や、最大値、最小値などを取得しました。

今回は、TestID ごとにグルーピングして、TestIDごとの集計をひとつのクエリー取得してみましょう。

※ Student、Test、TestResult テーブルを作っていない人は、「 T-SQL の集計関数を使う 1 」 に戻って作っておいてください。


GROUP BY 句によるグルーピング

GROUP BY

結果セットをグルーピングするには GROUP BY 句を使って、グループ化するカラムを指定します。

おさらいになりますが、 SELECT ステートメントの構文は以下の通りです。

[ WITH ] 
SELECT select_list [ INTO new_table ]
[ FROM table_source ]
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]

例えば、以下のような TestResult テーブルから、TestID ごとの最大値、最小値を取得するには次のように指定します。

[ TestResult テーブル ]
グループごとに集計する 1


SELECT      TestID,
            MIN(Score) AS MIN_Score,
            MAX(Score) AS MAX_Score
FROM        TestResult
GROUP BY    TestID;

[ 実行結果 ]
グループごとに集計する 2


以下のような Students テーブルから、誕生日の年ごと、性別ごとでグルーピングした学生の人数を知りたい場合、次のように取得することができます。

[ Students テーブル ]
グループごとに集計する 3


SELECT      YEAR(Birthday) AS BirthdayYear,
            Gender,
            COUNT(*) AS StudentCount
FROM        Students
GROUP BY    YEAR(Birthday),
            Gender;

[ 実行結果 ]
グループごとに集計する 4


GROUP BY を使うと SELECT 句に指定できるカラムは GROUP BY で指定したカラムと、集計関数や定数など、グループごとにひとつの値を返すものだけになり、それ以外のカラムを指定するとエラーになります。

グループごとに集計する 6


HAVING

GROUP BY と一緒に使われて、結果に含めるグループの条件を指定できるのが、HAVING 句です。

例えば、先ほどの学生数のカウントの例に加えて、学生が二人以上存在するグループのみを取得したいような時は、次のように指定することができます。

SELECT      YEAR(Birthday) AS BirthdayYear,
            Gender,
            COUNT(*) AS StudentCount
FROM        Students
GROUP BY    YEAR(Birthday),
            Gender
HAVING      COUNT(*) > 1;

[ 実行結果 ]
グループごとに集計する 5

これまで、ひとつのテーブルからレコードを取得してきましたが、今度は二つ以上のテーブルを結合してレコードを取得してみましょう!

次へ JOIN (結合) を使いこなそう

SQL Server 関連の人気書籍
ホーム > SQL の基本 > GROUP BY でグルーピングして集計する