暂无图片
请教高手这个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
打赏 0
暂无图片
刘晓华

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

暂无图片 评论
暂无图片 有用 0
打赏 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
打赏 0
刘晓华
题主
2021-10-27
我试了,确实能查出来,不过with部分,每个level出来的记录是人数的level-1 次方,性能确实有影响,随手就能写这么一段,已经很厉害了,谢谢~~
回答交流
Markdown


请输入正文
提交
相关推荐
请教,case when出来的值如何相加?
回答 2
sys@ORCL08SEP21&gt;select(casewhen11then1else0end)1fromdual;(CASEWHEN11THEN1ELSE0END)12不清楚你是不是这个意思?还
一个优先级顺序的SQL问题
回答 4
写错了是汇率日期&nbsp;
SQL 语句读取授权
回答 2
可以参考一下这个帖子https://social.msdn.microsoft.com/Forums/enUS/ef6b02eaf24f4b859347fe7f02cbf84a/grantaccess
现在主流sql用什么版本?
回答 3
已采纳
Oracle19CMySQL8DM8
mac 版的sql 视图工具有哪些?
回答 1
视图工具?概念有点模糊,er图?性能分析工具?oracle推荐sqldeveloper、sqlc,mysql推荐mysqlworkbench、mysqlshell,或开源的dbeave也是不错选择;
在SQL登入界面中,在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。
回答 1
已采纳
外网。首先看端口是否有映射。telnet&nbsp;端口能否通,防火墙关闭。然后要起用TCP/IP&nbsp;协议。如果用的机器名&nbsp;还是启用&nbsp;命名管道
sql字节大小的问题,MySQL默认1兆,达梦dm.ini是哪个参数?
回答 1
在达梦数据库中,可以通过修改dm.ini文件中的参数来设置最大的SQL语句大小限制。具体来说,需要修改maxpacketsize参数。maxpacketsize参数指定了客户端和服务器之间交换数据时的
各位大神,有没有什么方法可以从地址中提取出城市名称呀,比如说曼谷,这个户籍地址是身份证地址
回答 1
已采纳
首先,应该转成英文或者汉字存储。我们跨境业务的开发团队找过我要数据库支持小语种,我说合同都是小语种写的吗?开发说合同上一般都是英文。国际上惯例也是多国跨境业务的文档,惯例都转换成英文。然后开发就不提这
为什么联表查询并不是两个SQL查到的数据相加?
回答 1
要看你指定的连接类型fulljoin就是两个数据相加。
有没有办法可以在where 中动态写条件,就是加个判断,如果满足条件一则执行where 1否则执行 where 2
回答 4
听上去很复杂,其实是自己把自己搞复杂了,一个or就完了where(条件1and&nbsp;where1)&nbsp;or(not条件1andwhere2)