有以下表
日期 增加 减少
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 …
按照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.日期, 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
SELECT t1 日期, add 增加, reduce 减少,(add-reduce) 值 from table GROUP BY t1