テーブルに次のデータがあるとします。
groupName volume class mark
---------- ------- ------ ----
group1 50 1 o
group1 50 1 o
group1 50 1 x
group1 25 2 o
group2 25 1 x
group2 17 3 x
group2 11 2 o
group3 11 1 o
group3 19 3 x
最後に合計行を追加する必要があります (SUMボリュームとNULL残りの列)。
私が必要とすることは、合計を次のunion allように追加することで達成できることを知っています:
select 0 as isTotal, groupName, class, mark, volume
from dataTable
union all
select 1, NULL, NULL, NULL, sum(volume)
from dataTable
order by isTotal, groupName, class
ただし、この方法ではテーブルが 2 回スキャンされます。
データを 2 回スキャンするのを避けるために、group by以下を使用してみました。
select grouping(groupName) as isTotal, groupName, class, mark, sum(volume) as volume
from dataTable
group by grouping sets ((), (groupName, class, mark, volume))
order by isTotal, groupName, class
この方法では、テーブル スキャンは 1 つしかなく、サンプル データの最初の 2 つの行 (重複) が 1 つにマージされ、重複を別の行として保持する必要があることを除いて、必要なものはほとんど得られます。
質問: テーブル データが 1 回スキャンされ、重複が別の行として保持されるように、合計行が追加されたテーブル データを取得することは可能ですか?
望ましい結果は、union allクエリによって返されるものです。
isTotal groupName class mark volume
------- ----------- ------ ---- -------
0 group 1 1 o 50
0 group 1 1 o 50
0 group 1 1 x 50
0 group 1 2 o 25
0 group 2 1 x 25
0 group 2 2 o 11
0 group 2 3 x 17
0 group 3 1 o 11
0 group 3 3 x 19
1 NULL NULL NULL 258
group by grouping setsクエリによって返される結果:
isTotal groupName class mark volume
------- ---------- ------ ---- -------
0 group 1 1 o 100
0 group 1 1 x 50
0 group 1 2 o 25
0 group 2 1 x 25
0 group 2 2 o 11
0 group 2 3 x 17
0 group 3 1 o 11
0 group 3 3 x 19
1 NULL NULL NULL 258

