1. 程式人生 > >Oracle 使用分析函式實現小計合計

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):