今天應朋友要求寫了一段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