SQLServerでSQLだけでデータの小計や総合計を出力する方法
SQLServerでは「WITH ROLLUP」と「GROUPING()」を組み合わせて利用することで、データの小計や総合計を出力することができます。
SQLserverのSQLで小計や総合計を出力する
複数の会社で複数の部署が存在するデータの小計と総合計を出力します。
--会社ごと、部署ごとのテーブルを準備する
CREATE TABLE 売上管理情報
(
会社 VARCHAR(50)
,名前 VARCHAR(50)
,部署 VARCHAR(50)
,売上 INT
)
--データを挿入する
INSERT INTO 売上管理情報 VALUES( 'システムトラスト','トラスト太郎','営業部',1000);
INSERT INTO 売上管理情報 VALUES( 'システムトラスト','トラスト次郎','営業部',1000);
INSERT INTO 売上管理情報 VALUES( 'システムトラスト','トラスト三郎','技術部',1000);
INSERT INTO 売上管理情報 VALUES( 'システムトラスト','トラスト四郎','技術部',1000);
INSERT INTO 売上管理情報 VALUES( 'システムトラスト','トラスト五郎','営業部',1000);
INSERT INTO 売上管理情報 VALUES( 'IVG1','IVG1太郎','営業部',1000);
INSERT INTO 売上管理情報 VALUES( 'IVG1','IVG1次郎','営業部',3000);
INSERT INTO 売上管理情報 VALUES( 'IVG1','IVG1三郎','総務部',2000);
INSERT INTO 売上管理情報 VALUES( 'IVG1','IVG1四郎','技術部',5000);
INSERT INTO 売上管理情報 VALUES( 'IVG1','IVG1五郎','営業部',6000);
INSERT INTO 売上管理情報 VALUES( 'IVG2','IVG2太郎','営業部',1000);
INSERT INTO 売上管理情報 VALUES( 'IVG2','IVG2次郎','営業部',3000);
INSERT INTO 売上管理情報 VALUES( 'IVG2','IVG2三郎','技術部',2000);
INSERT INTO 売上管理情報 VALUES( 'IVG2','IVG2四郎','管理部',5000);
INSERT INTO 売上管理情報 VALUES( 'IVG2','IVG2五郎','営業部',6000);
--会社ごとの合計(小計)を出しながら総合合計を出力する
SELECT
CASE WHEN (GROUPING(会社) = 1) THEN '総合計'
ELSE ISNULL(会社, 'UNKNOWN')
END AS 会社名
,CASE WHEN (GROUPING(部署) = 1) THEN '会社計'
ELSE ISNULL(部署, 'UNKNOWN')
END AS 部署名
,SUM(売上) AS 売上金額
FROM
売上管理情報
GROUP BY
会社
,部署
WITH ROLLUP
--テーブルを消す
DROP TABLE 売上管理情報
実行結果は以下のようになります。
| 会社名 | 部署名 | 売上金額 |
|---|---|---|
| IVG1 | 営業部 | 10000 |
| IVG1 | 技術部 | 5000 |
| IVG1 | 総務部 | 2000 |
| IVG1 | 会社計 | 17000 |
| IVG2 | 営業部 | 10000 |
| IVG2 | 管理部 | 5000 |
| IVG2 | 技術部 | 2000 |
| IVG2 | 会社計 | 17000 |
| システムトラスト | 営業部 | 3000 |
| システムトラスト | 技術部 | 2000 |
| システムトラスト | 会社計 | 5000 |
| 総合計 | 会社計 | 39000 |
以上、SQLServerでSQLだけでデータの小計や総合計を出力する方法でした。







