一段累計計算與折行並用的SQL

今天應朋友要求寫了一段SQL給大家分享一下。

數據庫裏有三條數據,它們分別是從其它表中提取或運算出來的,通過union合併成一個三行數據。

SELECT 0 qlje, 1028800 totmoeny FROM DUAL
UNION
SELECT 20 qlje, 2500 totmoeny FROM DUAL
UNION
SELECT 100 qlje, 300 totmoeny FROM DUAL

要求是要顯示成

累計 第一行值  第二行值 第三行值

120 1028800 2500 300

 

方法一:

分析

根據結果來看累計是三行的合計值,第一列,第二列,第三列分別對應第一行值、第二行值、第三行值

所以此sql中應用到了sum和折行的功能。

oracle的sum功能中有一個按類型進行求合的功能。因爲此sql需要添加第一個輔助列ftype.他就是要爲了求合。

折行功能如何實現呢?通常情況下折行是通過decode來實現的。但decode一定要指定他的唯一列,那麼這個唯一列會是什麼呢?

因此我對原來的SQL中添加了第二個輔助列frow。

至此所有問題已解決。

以下例是詳細SQL

 

SELECT l_csum,
       SUM(totmoeny1) totmoeny1,
       SUM(totmoeny2) totmoeny2,
       SUM(totmoeny3) totmoeny3
  FROM (SELECT SUM(qlje) OVER(PARTITION BY ftype ORDER BY ftype RANGE UNBOUNDED PRECEDING) l_csum,
               DECODE(frow, 1, totmoeny) totmoeny1,
               DECODE(frow, 2, totmoeny) totmoeny2,
               DECODE(frow, 3, totmoeny) totmoeny3
          FROM (SELECT 0 qlje, 1028800 totmoeny, 1 ftype, 1 frow FROM DUAL
                UNION
                SELECT 20 qlje, 2500 totmoeny, 1 ftype, 2 frow FROM DUAL
                UNION
                SELECT 100 qlje, 300 totmoeny, 1 ftype, 3 frow FROM DUAL) ta) tb
 GROUP BY l_csum

 

方法二:

更爲簡單

SELECT SUM(qlje),
       sum(DECODE(frow, 1, totmoeny)) totmoeny1,
       sum(DECODE(frow, 2, totmoeny)) totmoeny2,
       sum(DECODE(frow, 3, totmoeny)) totmoeny3
  FROM (SELECT 0 qlje, 1028800 totmoeny, 1 frow
          FROM DUAL
        UNION
        SELECT 20 qlje, 2500 totmoeny, 2 frow
          FROM DUAL
        UNION
        SELECT 100 qlje, 300 totmoeny, 3 frow FROM DUAL) ta

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章