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

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

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

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

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

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

* YEAR() は引数の日付の年だけを整数で返してくれる組み込み関数です。


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


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

© 2010-2024 SQL Server 入門