SQL语句,如何写累计求和

有以下表
日期 增加 减少
2015-04-24 18709 12608
2015-04-25 28508 11412
2015-04-26 39092 20858
2015-04-27 80146 57995
2015-04-28 53581 19584
2015-04-29 50609 26319
2015-04-30 52969 28884
2015-05-01 79146 70007
2015-05-02 50536 38031
2015-05-03 58161 42329
2015-05-04 27287 14137

我需要用SQL语句得到下面的东西:
日期 增加 减少 留存率
2015-04-24 18709 12608 =(18709-12608)
2015-04-25 28508 11412 =(18709-12608)+(28508-11412)
2015-04-26 39092 20858 =(18709-12608)+(28508-11412)+( 39092-20858)
2015-04-27 80146 57995 下面依次类推
2015-04-28 53581 19584 …
2015-04-29 50609 26319 …
2015-04-30 52969 28884 …
2015-05-01 79146 70007 …
2015-05-02 50536 38031 …
2015-05-03 58161 42329 …
2015-05-04 27287 14137 …

sql

3个回答

按照1楼的回答,已经能达到答案了。不过我的原表也是写SQL得到的数据:

select convert(varchar(10),CreatedDate,121) AS [日期],
SUM(Case when Method = 1 then Count end) [增加],
SUM(Case when Method = 2 then count end) [减少]
from dbo.ItemSourceLog
group by convert(varchar(10),CreatedDate,121)

能否在此基础上,得到最终的结果呢。

SELECT t1 日期, add 增加, reduce 减少,(add-reduce) 值 from table GROUP BY t1

非递归的写法(应该所有的数据库都支持)

     SELECT t1.日期, t1.增加, t1.减少,
           SUM(t2.增加-t2.减少) 留存率
      FROM table1 t1
      JOIN table1 t2
        ON t2.日期 <= t1.日期
  GROUP BY t1.日期, t1.增加, t1.减少

递归的写法(SQL Server)

 WITH t0 AS (
    SELECT *,
           ROW_NUMBER() OVER(ORDER BY 日期) rn
      FROM table1
)
,t AS (
    SELECT rn,
           日期, 增加, 减少,
           (增加-减少) 留存率
      FROM t0
     WHERE rn = 1

    UNION ALL

    SELECT t2.rn,
           t2.日期, t2.增加, t2.减少,
           t1.留存率 + (t2.增加-t2.减少) 留存率
      FROM t t1
      JOIN t0 t2
        ON t2.rn = t1.rn + 1
)
SELECT 日期, 增加, 减少, 留存率
  FROM t
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐