暂无图片
请教高手这个SQL语句怎么写?
我来答
分享
刘晓华
2021-10-26
请教高手这个SQL语句怎么写?

我需将一段时间按月分成多段时间,例如2021/07/26----2021/10/25,分成如下3段

2021/07/26---2021/07/25

2021/08/26---2021/08/25

2021/09/26---2021/09/25

上面的SQL我写出来了,但问题是,每个人分别有一段时间,相当于要生成一个森林,而不是一棵单一的树,我如何将内层SQL里的where 条件去掉,得到每个人各自的时段记录呢?

select emid,coid,lcid,level as mon,
       decode(to_char(trunc(bdte_r1,'MM'),'YYYY-MM'),
              to_char(trunc(add_months(bdte_r1,(LEVEL - 1)),'MM'),'YYYY-MM'),
              bdte_r1,
              decode(sign(level-2),-1,bdte_r1,add_months(bdte_r2,level-2))
              ) start_date,
       decode(to_char(trunc(edte,'MM'),'YYYY-MM'),
              to_char(trunc(add_months(bdte_r1,LEVEL),'MM'),'YYYY-MM'),
              edte,
              decode(sign(level-1),-1,bdte_r1,add_months(bdte_r2,level-1)) -1
              ) as end_date
  from  (
         select emid,coid,lcid,
                svmn,                                                              --month(such as 3,5)
                bdte                                 as bdte_r1,              --begin date
                add_months_new(bdte,1) as bdte_r2,
                add_months(bdte,svmn)  as edte                   --end date
         from   v_hr_m_lsth_all                  
         where  rownum <2                    
         )
connect by level <= months_between(edte,bdte_r1)

例如:图1的两条记录,怎么生成图2的记录(上面的SQL只能查一条)






我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
刘晓华

用管道函数可以解决

暂无图片 评论
暂无图片 有用 0
暂无图片
刘晓华

我写了个procedure搞定,一条SQL搞定后面不知怎么写

暂无图片 评论
暂无图片 有用 0
chengang
2021-10-26
公用表达式,应该能满足
DarkAthena

随手写了段,你验证一下

with a as (select xx.*,add_months(BDTE_R1, level-1) b, decode(level, svmn, EDTE, add_months(BDTE_R1, level) - 1) e, level l from v_hr_m_lsth_all xx connect by add_months(BDTE_R1, level) <= EDTE) select distinct a.* from a order by emid,l

如果数据量太大的话,性能可能会有点问题

暂无图片 评论
暂无图片 有用 0
刘晓华
题主
2021-10-27
我试了,确实能查出来,不过with部分,每个level出来的记录是人数的level-1 次方,性能确实有影响,随手就能写这么一段,已经很厉害了,谢谢~~
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏