テーブルに次のデータがあるとします。
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