Oracle 使用分析函式實現小計合計
select grouping(vsaltype) as sq,
vsaltype || '小計計' vsaltype,
sum(amount) as amount,
'' vvin,
'' VPROPERTYWH,
'' VPROPERTYWHDESC
fromSPTW90_INVENTORY_NCS_TMP
group by rollup(vsaltype)
得到結果為:
:
分析結論:
Grouping(上卷欄位)兩種情況:
SQ為0情況:只是按照vsaltype進行group by
SQ為1情況:把小計情況進行一次彙總,即別文寫的 group by rollup(A,B,C)的流程是group by (A,B,C)->
group by (A,B) ->group by (A)-> 全表,本例只是執行後兩句
select -1 as sq,
vsaltype,
amount,
vvin,
VPROPERTYWH,
VPROPERTYWHDESC
from SPTW90_INVENTORY_NCS_TMP
得到結果為:
分析結論:得到所有明細資料,並賦一個新的虛擬欄位sq 並設sq為-1
這樣則:
select sq, vsaltype, amount, vvin, VPROPERTYWH,VPROPERTYWHDESC
from (select sq, vsaltype, amount, vvin, VPROPERTYWH, VPROPERTYWHDESC
from (select grouping(vsaltype) as sq,
vsaltype || '小計計' vsaltype,
sum(amount) as amount,
'' vvin,
'' VPROPERTYWH,
'' VPROPERTYWHDESC
from SPTW90_INVENTORY_NCS_TMP
group by rollup(vsaltype)
union all
select -1 as sq,
vsaltype,
amount,
vvin,
VPROPERTYWH,
VPROPERTYWHDESC
from SPTW90_INVENTORY_NCS_TMP
where 1 = 1) g
where g.sq <> 1
order by vsaltype, sq)
把sq為0,1行數與sq為-1行數進行union all
在where條件進行限定,取出sq非1的資料即sq<>1
So,取最終合計的話只需取出sq =1的情況
最終模型應該是這種效果(從Oracle中匯出的Excel):