• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

求一个递归汇总的SQL语句

weisaisz 2014-01-24 03:13:24
SQL版本:SQL2008

原数据(注意这里A产品 2013年 12月份是没有记录的)

年 月 产品 未出库数量
2013 11 A 100
2014 1 A 300
2013 10 B 1000
2013 11 B 1500
2013 12 B 3001

要求得出下面结果(主要要得出后面6个月的数据,最好多少个月可以定义):
年 月 产品 上月剩余未出库数量
2013 11 A 0
2013 12 A 100
2014 1 A 100
2014 2 A 400
...
2014 6 A 400
2013 10 B 0
2013 11 B 1000
2013 12 B 2500
2014 1 B 5501
2014 2 B 5501
......
2014 5 B 5501

谢谢

原帖在这,但是客户有括号中新的要求
http://bbs.csdn.net/topics/390694211
...全文
136 点赞 收藏 8
写回复
8 条回复
發糞塗牆 2014年01月24日
如果你的数据比较完整,本身没必要高那么复杂,可以的话,最好完善你的数据,这样计算起来也方便很多,另外,回复记得引用,这样我就知道你问我问题了,不然半天都没反映
回复 点赞
發糞塗牆 2014年01月24日
引用 6 楼 weisaisz 的回复:
呵呵,大侠,我只有20分,后面我新增个帐号送分给你 我突然想到,只要把最开始那个表填充完整,然后使用之前的做法是否简便一些?
是的,我的with d的功能也是帮你填充完
回复 点赞
weisaisz 2014年01月24日
呵呵,大侠,我只有20分,后面我新增个帐号送分给你 我突然想到,只要把最开始那个表填充完整,然后使用之前的做法是否简便一些?
回复 点赞
發糞塗牆 2014年01月24日
你这20分够累人的
回复 点赞
發糞塗牆 2014年01月24日
我下面有注释的地方可以用变量控制你要取多少个月,6个月就填7
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([年] int,[月] int,[产品] varchar(1),[未出库数量] int)
insert [huang]
select 2013,11,'A',100 union all
select 2014,1,'A',300 union all
select 2013,10,'B',1000 union all
select 2013,11,'B',1500 union all
select 2013,12,'B',3001
--------------开始查询--------------------------
;WITH d AS 
(
 SELECT CONVERT(VARCHAR(10),DATEADD(mm,number,'2013-11-01'),120)[date],b.产品
 FROM master..spt_values cross JOIN (SELECT DISTINCT 产品 FROM [huang]) b
 WHERE [type]='p' AND number>0 AND number<7  --这个7可以控制月份

),cte AS (
select ISNULL([年],YEAR(d.[date])) [年],ISNULL([月],month(d.[date])) [月],ISNULL(a.[产品],d.产品) 产品,ISNULL([未出库数量],0)[未出库数量],ROW_NUMBER()OVER(PARTITION BY ISNULL(a.[产品],d.产品) ORDER BY ISNULL([年],YEAR(d.[date])),ISNULL([月],month(d.[date]))) id
 from [huang] a full JOIN d ON a.[年]=YEAR(d.[date]) AND a.[月]=MONTH(d.[date]) AND a.[产品]=d.产品
 ) 


 SELECT [年],[月],[产品],ISNULL((SELECT SUM([未出库数量]  ) FROM cte b WHERE a.id>b.id AND a.[产品]=b.[产品]),0)[未出库数量]
  FROM cte a 
 ORDER BY [产品],[年],a.月

 /*
 年           月           产品   未出库数量
----------- ----------- ---- -----------
2013        11          A    0
2013        12          A    100
2014        1           A    100
2014        2           A    400
2014        3           A    400
2014        4           A    400
2014        5           A    400
2013        10          B    0
2013        11          B    1000
2013        12          B    2500
2014        1           B    5501
2014        2           B    5501
2014        3           B    5501
2014        4           B    5501
2014        5           B    5501
 */
回复 点赞
weisaisz 2014年01月24日
年 月 产品 未出库数量 2013 11 A 100 2014 1 A 300 如果按照上次的做法,客户查询条件是2013年12月份,结果也是空吧 因为客户不是没一个月都有未出库数量的
回复 点赞
weisaisz 2014年01月24日
注意括号的内容 以A产品为例,如果客户查询条件是2014年2月份,结果是空
回复 点赞
發糞塗牆 2014年01月24日
跟上次的有什么异同?
回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告