SQLServerでは「WITH ROLLUP」を利用すると簡単に小計、総合計を出力することができます。
「WITH ROLLUP」を使って小計、総合計を出力
SQLで小計、総合計を出力を出力するにはGroup BY句に「WITH ROLLUP」を指定します、
テーブル準備
男女別、教科別の得点を管理できるテーブルを作成します。
CREATE TABLE test_table ( name VARCHAR(20) ,gender VARCHAR(20) ,subjects VARCHAR(20) ,points INT )
データ準備
テーブルに国語、数学、英語ごとに男女それぞれ2名分のデータを作成します。
INSERT INTO test_table VALUES( 'taro', 'BOY', '国語', 10) INSERT INTO test_table VALUES( 'taro', 'BOY', '数学', 15) INSERT INTO test_table VALUES( 'taro', 'BOY', '英語', 10) INSERT INTO test_table VALUES( 'jiro', 'BOY', '国語', 25) INSERT INTO test_table VALUES( 'jiro', 'BOY', '数学', 35) INSERT INTO test_table VALUES( 'jiro', 'BOY', '英語', 20) INSERT INTO test_table VALUES( 'hana', 'GIRL', '国語', 45) INSERT INTO test_table VALUES( 'hana', 'GIRL', '数学', 50) INSERT INTO test_table VALUES( 'hana', 'GIRL', '英語', 30) INSERT INTO test_table VALUES( 'miki', 'GIRL', '国語', 60) INSERT INTO test_table VALUES( 'miki', 'GIRL', '数学', 65) INSERT INTO test_table VALUES( 'miki', 'GIRL', '英語', 40)
WITH ROLLUPを使って小計行、総合計行を取得
「WITH ROLLUP」を使って実際に教科ごと、男女別に小計行と総合計行を取得します。
SELECT CASE WHEN (GROUPING(subjects) = 1) THEN '全教科合計' ELSE ISNULL(subjects, 'UNKNOWN') END AS 教科 ,CASE WHEN (GROUPING(gender) = 1) THEN 'BOYS AND GIRLS' ELSE ISNULL(gender, 'UNKNOWN') END AS 性別 ,SUM(points) AS 合計点 FROM test_table GROUP BY subjects ,gender WITH ROLLUP
実行結果は
教科 | 性別 | 合計点 |
---|---|---|
英語 | BOY | 30 |
英語 | GIRL | 70 |
英語 | BOYS AND GIRLS | 100 |
国語 | BOY | 35 |
国語 | GIRL | 105 |
国語 | BOYS AND GIRLS | 140 |
数学 | BOY | 50 |
数学 | GIRL | 115 |
数学 | BOYS AND GIRLS | 165 |
全教科合計 | BOYS AND GIRLS | 405 |
となり、男女別の小計行と総合計行が出力されています。
ちなみに「WITH ROLLUP」がないと
教科 | 性別 | 合計点 |
---|---|---|
英語 | BOY | 30 |
国語 | BOY | 35 |
数学 | BOY | 50 |
英語 | GIRL | 70 |
国語 | GIRL | 105 |
数学 | GIRL | 115 |
と小計行と総合計行が出力されません。
あたりまえですね。
テーブル削除
テーブルを削除しておきます。
DROP TABLE test_table
このように「WITH ROLLUP」を使うと簡単に小計行と総合計行を取得することができますね。