跪求一条统计SQL?

liyujiang688447 2013-05-29 08:54:47
有如下表:

个人编号 区域码编码 年度 年月 类型 基数
123 5110 2011 201101 1 0
123 5110 2011 201102 1 0
123 5110 2011 201103 1 100
123 5110 2011 201104 1 100
123 5110 2011 201105 1 100
123 5110 2011 201106 1 100
123 5110 2011 201107 1 0
123 5110 2011 201108 1 100
123 5110 2011 201109 1 100
123 5110 2011 201110 1 0
123 5110 2011 201111 1 0
123 5110 2011 201112 1 0
123 3330 2011 201101 2 0
123 3330 2011 201102 2 0
123 3330 2011 201103 2 0
123 3330 2011 201104 2 0
123 3330 2011 201105 2 0
123 3330 2011 201106 2 0
123 3330 2011 201107 2 0
123 3330 2011 201108 2 0
123 3330 2011 201109 2 0
123 3330 2011 201110 2 0
123 3330 2011 201111 2 100
123 3330 2011 201112 2 100

按以上表用一条SQL语句统计出如下结果(注:个人编号、区域码编码、年月为联合主键):

个人编号 区域码编码 年度 开始年月 结束年月 基数和
123 5110 2011 201101 201202 0
123 5110 2011 201103 201206 400
123 5110 2011 201107 201207 0
123 5110 2011 201108 201209 200
123 3330 2011 201110 201210 0
123 3330 2011 201111 201212 200

跪求解题啊!谢谢各位大侠了,小弟很急呀!麻烦了,在线等哟。。
...全文
215 5 点赞 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
vanjayhsu 2013-05-30
引用 1 楼 super007007007 的回复:
with a as( select 123 a, 5110 b, 2011 c, 201101 d, 1 e, 0 f from dual union select 123 a, 5110 b, 2011 c, 201102 d, 1 e, 0 f from dual union select 123 a, 5110 b, 2011 c, 201103 d, 1 e, 100 f from dual union select 123 a, 5110 b, 2011 c, 201104 d, 1 e, 100 f from dual union select 123 a, 5110 b, 2011 c, 201105 d, 1 e, 100 f from dual union select 123 a, 5110 b, 2011 c, 201106 d, 1 e, 100 f from dual union select 123 a, 5110 b, 2011 c, 201107 d, 1 e, 0 f from dual union select 123 a, 5110 b, 2011 c, 201108 d, 1 e, 100 f from dual union select 123 a, 5110 b, 2011 c, 201109 d, 1 e, 100 f from dual union select 123 a, 5110 b, 2011 c, 201110 d, 1 e, 0 f from dual union select 123 a, 5110 b, 2011 c, 201111 d, 1 e, 0 f from dual union select 123 a, 5110 b, 2011 c, 201112 d, 1 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201101 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201102 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201103 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201104 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201105 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201106 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201107 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201108 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201109 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201110 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201111 d, 2 e, 100 f from dual union select 123 a, 3330 b, 2011 c, 201112 d, 2 e, 100 f from dual ) , b as( select a ,b ,c ,d ,e ,f ,rownum rn from a ) ,c as( select a ,b ,c ,d ,e ,f ,rn ,row_number() over (partition by a,b,c,e,case when f>0 then 1 else 0 end order by d) rn1 ,rn - row_number() over (partition by a,b,c,e,case when f>0 then 1 else 0 end order by d) rn2 from b ) select a ,b ,c ,min(d) ,max(d) ,sum(f) from c group by a,b,c,rn2 order by 1,2 desc ,4 ;
赞一个,用这个就可以了。。。
  • 打赏
  • 举报
回复
hh7yx 2013-05-30
引用 3 楼 vanjayhsu 的回复:
[quote=引用 2 楼 u010412956 的回复:] 开始年月 结束年月 这里你没有说明白?
同感。而且你的结果里面还写错了,结束年月那里应该都是2011XX吧。感觉楼主的统计方式应该是这样: 1、从201101开始,如果基数为0,则找到下一个基数不为0之前的一个月作为一行; 2、从下一个不为0的一个月开始(例如201103),找到下一个不为0的一个月作为一行(例如201106),统计这期间的基数; 3、遍历2011年,重复1、2[/quote] 不知道下面的为什么没有统计: 123 3330 2011 201101 2 0 123 3330 2011 201102 2 0 123 3330 2011 201103 2 0 123 3330 2011 201104 2 0 123 3330 2011 201105 2 0 123 3330 2011 201106 2 0 123 3330 2011 201107 2 0 123 3330 2011 201108 2 0 123 3330 2011 201109 2 0 看结果猜楼主的想法真没意思。。。。
  • 打赏
  • 举报
回复
vanjayhsu 2013-05-30
引用 2 楼 u010412956 的回复:
开始年月 结束年月 这里你没有说明白?
同感。而且你的结果里面还写错了,结束年月那里应该都是2011XX吧。感觉楼主的统计方式应该是这样: 1、从201101开始,如果基数为0,则找到下一个基数不为0之前的一个月作为一行; 2、从下一个不为0的一个月开始(例如201103),找到下一个不为0的一个月作为一行(例如201106),统计这期间的基数; 3、遍历2011年,重复1、2
  • 打赏
  • 举报
回复
hh7yx 2013-05-30
开始年月 结束年月 这里你没有说明白?
  • 打赏
  • 举报
回复
super007007007 2013-05-30
with a as( select 123 a, 5110 b, 2011 c, 201101 d, 1 e, 0 f from dual union select 123 a, 5110 b, 2011 c, 201102 d, 1 e, 0 f from dual union select 123 a, 5110 b, 2011 c, 201103 d, 1 e, 100 f from dual union select 123 a, 5110 b, 2011 c, 201104 d, 1 e, 100 f from dual union select 123 a, 5110 b, 2011 c, 201105 d, 1 e, 100 f from dual union select 123 a, 5110 b, 2011 c, 201106 d, 1 e, 100 f from dual union select 123 a, 5110 b, 2011 c, 201107 d, 1 e, 0 f from dual union select 123 a, 5110 b, 2011 c, 201108 d, 1 e, 100 f from dual union select 123 a, 5110 b, 2011 c, 201109 d, 1 e, 100 f from dual union select 123 a, 5110 b, 2011 c, 201110 d, 1 e, 0 f from dual union select 123 a, 5110 b, 2011 c, 201111 d, 1 e, 0 f from dual union select 123 a, 5110 b, 2011 c, 201112 d, 1 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201101 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201102 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201103 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201104 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201105 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201106 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201107 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201108 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201109 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201110 d, 2 e, 0 f from dual union select 123 a, 3330 b, 2011 c, 201111 d, 2 e, 100 f from dual union select 123 a, 3330 b, 2011 c, 201112 d, 2 e, 100 f from dual ) , b as( select a ,b ,c ,d ,e ,f ,rownum rn from a ) ,c as( select a ,b ,c ,d ,e ,f ,rn ,row_number() over (partition by a,b,c,e,case when f>0 then 1 else 0 end order by d) rn1 ,rn - row_number() over (partition by a,b,c,e,case when f>0 then 1 else 0 end order by d) rn2 from b ) select a ,b ,c ,min(d) ,max(d) ,sum(f) from c group by a,b,c,rn2 order by 1,2 desc ,4 ;
  • 打赏
  • 举报
回复
相关推荐
发帖
Oracle
创建于2007-09-28

1.6w+

社区成员

Oracle开发相关技术讨论
申请成为版主
帖子事件
创建了帖子
2013-05-29 08:54
社区公告
暂无公告