一段累计计算与折行并用的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值