SQLServerで「WITH ROLLUP」を使って小計、総合計を出力する

記事内に広告が含まれています。

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

タイトルとURLをコピーしました