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だけでデータの小計や総合計を出力する方法でした。