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