SQLで日付やカテゴリ、場所などの条件ごとに集計を行うと、次に必要になるのが「最後に合計行を追加したい」という処理です。通常のGROUP BYでは指定した単位ごとの集計しか取得できませんが、SQLには小計や総合計を作成するための便利な機能があります。この記事では、集計結果に縦方向・横方向の合計を表示する方法や、ROLLUPなどを利用した効率的な書き方について解説します。
GROUP BYだけでは合計行は自動で追加されない
SQLのGROUP BYは、指定した項目ごとにデータをまとめて集計するための機能です。例えば、日付ごとの出荷数や場所ごとの数量を集計する場合には非常に便利です。
しかし、GROUP BYで作成された結果には通常、各グループの集計結果だけが表示されます。そのため、「すべての日付をまとめた合計」や「すべての場所を合わせた総合計」は別途作成する必要があります。
例えば以下のような結果がある場合、通常のGROUP BYでは日付ごとの行しか取得できません。
| 日付 | A地点 | B地点 |
|---|---|---|
| 2026/7/1 | 100 | 200 |
| 2026/7/2 | 150 | 250 |
ここに「合計」という行を追加するには、別の集計処理が必要になります。
UNION ALLで合計行を追加する基本方法
多くのSQL環境で利用できる方法が、通常の集計結果と合計用の集計結果をUNION ALLで結合する方法です。
例えば、通常の結果を取得するSQLと、全体をSUMするSQLを別々に作成し、それぞれの結果を縦に結合します。
SELECT 日付, SUM(数量) AS 合計
FROM 出荷テーブル
GROUP BY 日付
UNION ALL
SELECT '合計' AS 日付, SUM(数量) AS 合計
FROM 出荷テーブル;
この方法では、最後に「合計」という文字を持つ行を自由に追加できます。シンプルで分かりやすいため、SQL初心者にも扱いやすい方法です。
ROLLUPを使って小計と総合計を作成する方法
利用しているデータベースが対応している場合は、ROLLUPを使うと合計行を簡単に作成できます。
ROLLUPはGROUP BYの拡張機能で、通常のグループ集計に加えて、小計や総合計の行を自動生成できます。
SELECT
日付,
場所,
SUM(数量) AS 合計
FROM 出荷テーブル
GROUP BY ROLLUP(日付, 場所);
この場合、日付ごとの場所別集計だけではなく、日付単位の小計や全体の総合計も取得できます。
例えば以下のような結果になります。
| 日付 | 場所 | 数量 |
|---|---|---|
| 2026/7/1 | A地点 | 100 |
| 2026/7/1 | B地点 | 200 |
| 2026/7/1 | NULL | 300 |
| NULL | NULL | 全体合計 |
NULLの部分をCASE文などで「合計」という表示に変更すれば、帳票形式の結果にできます。
GROUP BY ROLLUPの合計表示を変更する方法
ROLLUPで生成される合計行では、集計対象の列がNULLになります。そのままだと利用者には意味が分かりにくいため、CASE文やCOALESCEを使って表示を変更します。
SELECT
CASE
WHEN 日付 IS NULL THEN '総合計'
ELSE 日付
END AS 表示日付,
SUM(数量) AS 合計
FROM 出荷テーブル
GROUP BY ROLLUP(日付);
このようにすると、NULLになっている集計行を「総合計」などの分かりやすい文字列へ変更できます。
縦方向と横方向の合計を作る場合の考え方
質問のように、表形式で「行の最後にも合計」「列の最後にも合計」を表示したい場合は、SQLだけで完全な表形式を作るより、集計データを取得して表示側で加工する方法もよく使われます。
SQLは本来、データを取得・集計することが得意な仕組みです。一方、Excelのような帳票形式のレイアウト調整は、アプリケーション側やBIツール側で行うことが多くあります。
例えば、SQLでは以下のようなデータを返します。
| 日付 | A地点 | B地点 |
|---|---|---|
| 7/1 | 100 | 200 |
| 7/2 | 150 | 250 |
その後、画面表示側で最終列に行合計、最終行に列合計を追加すると管理しやすくなります。
データベースごとの対応状況に注意する
ROLLUPやGROUPING関数などの集計機能は、利用しているデータベースによって書き方が異なります。
| データベース | 代表的な機能 |
|---|---|
| Oracle | ROLLUP、GROUPING SETS |
| SQL Server | ROLLUP、GROUPING SETS |
| MySQL | ROLLUP対応あり(バージョンによる) |
| PostgreSQL | ROLLUP、GROUPING SETS |
使用している環境によって最適な方法が変わるため、SQLを書く前に利用しているデータベースの種類を確認することが重要です。
まとめ|SQLの合計行追加はROLLUPやUNION ALLを使い分ける
SQLで集計結果に「合計」という行を追加したい場合、基本的にはUNION ALLで合計用SELECTを追加する方法か、ROLLUPなどの集計機能を利用する方法があります。
単純な合計行ならUNION ALLが分かりやすく、複数階層の小計や総合計が必要ならROLLUPが便利です。
また、横方向と縦方向の合計を含む帳票形式の表示は、SQLだけで無理に作るより、表示側で加工する設計も検討すると、保守しやすいシステムになります。


コメント