求高手解决 累计及需求的计算

Justin_chen 2016-03-24 07:12:33


我想通过表一得到表二,累计还知道写,但需求不知道怎么写了。

表一

日期 ITEMID 数量 累计 需求
3-1 1001 100
3-2 1001 -80
3-3 1001 -30
3-4 1001 -50
……
3-1 1002 60
3-2 1002 -30
3-3 1002 -50

表二
(表二是通过表一的数据计算两列,一列是累计,另一列是需求数量,累计是按日期、ITEMID,从上往下累加。
需求则是第一个累计出现负数的时候,则取这个累计值,后面则不需累计的值,直接取数量中的负数做为需求数量。)
日期 ITEMID 数量 累计 需求
3-1 1001 100 100 0
3-2 1001 -80 20 0
3-3 1001 -30 -10 10
3-4 1001 -50 -60 50
……
3-1 1002 60 60 0
3-2 1002 -30 30 0
3-3 1002 -50 -20 20
...全文
132 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Justin_chen 2016-03-27
  • 打赏
  • 举报
回复
谢谢各位大大的帮助。结贴。
RINK_1 2016-03-24
  • 打赏
  • 举报
回复
with CTE(日期,ITEMID,数量) as ( select '3-1',1001,100 union all select '3-2',1001,-80 union all select '3-3',1001,-30 union all select '3-4',1001,-50 union all select '3-1',1002,60 union all select '3-2',1002,-30 union all select '3-3',1002,-50) SELECT A.日期,A.ITEMID,A.数量,C.累计, CASE WHEN ISNULL(E.上一累计,0)>=0 AND C.累计<0 THEN ABS(C.累计) WHEN ISNULL(E.上一累计,0)<0 AND C.累计<0 THEN ABS(A.数量) ELSE 0 END AS 需求 FROM CTE A CROSS APPLY (SELECT SUM(数量) AS 累计 FROM CTE B WHERE A.ITEMID=B.ITEMID AND A.日期>=B.日期) AS C CROSS APPLY (SELECT SUM(数量) AS 上一累计 FROM CTE D WHERE A.ITEMID=D.ITEMID AND A.日期>D.日期) AS E
Ekun_sky 2016-03-24
  • 打赏
  • 举报
回复
with a(日期,ITEMID,数量) as (
select '3-1',1001,100 union all	
select '3-2',1001,-80 union all      
select '3-3',1001,-30 union all         
select '3-4',1001,-50 union all         
select '3-1',1002,60 union all        
select '3-2',1002,-30 union all         
select '3-3',1002,-50)




select a.*,SUM(b.数量) as 累计,case when SUM(b.数量)<0 then -1*SUM(b.数量) else 0 end  as 需求
 from a inner join a as b on a.ITEMID=b.ITEMID and a.日期>=b.日期
group by a.日期,a.ITEMID,a.数量 order by a.ITEMID,a.日期

/*
日期 itemid 数量 累计 需求
3-1	1001	100	100	0
3-2	1001	-80	20	0
3-3	1001	-30	-10	10
3-4	1001	-50	-60	60
3-1	1002	60	60	0
3-2	1002	-30	30	0
3-3	1002	-50	-20	20
*/

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧