SQLServerでSQLだけでデータの小計や総合計を出力する方法

2018/05/10データベースSQLServer

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

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

 

システムトラストでは一緒に働いていただける仲間を募集中です。
株式会社システムトラスト

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ