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」を使うと簡単に小計行と総合計行を取得することができますね。
