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 テーブル ]
SELECT TestID, MIN(Score) AS MIN_Score, MAX(Score) AS MAX_Score FROM TestResult GROUP BY TestID;
[ 実行結果 ]
以下のような Students テーブルから、誕生日の年ごと、性別ごとでグルーピングした学生の人数を知りたい場合、次のように取得することができます。
[ Students テーブル ]
SELECT YEAR(Birthday) AS BirthdayYear, Gender, COUNT(*) AS StudentCount FROM Students GROUP BY YEAR(Birthday), Gender;
[ 実行結果 ]
* YEAR() は引数の日付の年だけを整数で返してくれる組み込み関数です。
GROUP BY を使うと SELECT 句に指定できるカラムは GROUP BY で指定したカラムと、集計関数や定数など、グループごとにひとつの値を返すものだけになり、それ以外のカラムを指定するとエラーになります。
HAVING でグループの条件を指定する
GROUP BY と一緒に使われて、結果に含めるグループの条件を指定できるのが、HAVING 句です。
例えば、先ほどの学生数のカウントの例に加えて、学生が二人以上存在するグループのみを取得したいような時は、次のように指定することができます。
SELECT YEAR(Birthday) AS BirthdayYear, Gender, COUNT(*) AS StudentCount FROM Students GROUP BY YEAR(Birthday), Gender HAVING COUNT(*) > 1;
[ 実行結果 ]
これまで、ひとつのテーブルからレコードを取得してきましたが、今度は二つ以上のテーブルを結合してレコードを取得してみましょう!