一段累计计算与折行并用的SQL

时间:2021-06-28 00:38:33

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