如何在SQL中编写拆分语句,如果开始和结束日期的月份不同,则会将记录划分为2条记录?

问题描述:

我有以下SQL代码,如果'COV_PRD_STRT_DT'和'COV_PRD_END_DT'是不同的月份,我需要将行分成两行。如何在SQL中编写拆分语句,如果开始和结束日期的月份不同,则会将记录划分为2条记录?

WITH CTE AS 
(SELECT COV_PRD_STRT_DT,TO_DATE,COV_PRD_END_DT as MO_END_DT, 
    case when dateadd (DAY,-DAY(DATEADD(MONTH,1, BF.COV_PRD_STRT_DT)), 
    DATEADD(MONTH,1, d.from_date)) 
    < To_date THEN DATEADD(DAY,-DAY(DATEADD(MONTH,1, BF.COV_PRD_END_DT)), 
    DATEADD(MONTH,1, BF.COV_PRD_END_DT)) 
    ELSE To_Date END as MO_END_DT   
    FROM BILLING_FACT 
    UNION ALL 
    SELECT COV_PRD_STRT_DT,To_date,DATEADD(DAY,1,BF.COV_PRD_END_DT) as                   MO_END_DT, < TO_DATE 
    THEN DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1,BF.COV_PRD_END_DT))) 
    ELSE To_Date END as MO_END_DT 
    FROM CTE WHERE COV_PRD_END_DT < To_Date 
) 

select * from CTE order by COV_PRD_STRT_DT,COV_PRD_END_DT 

感谢

+2

可以显示一些示例数据和预期结果吗? –

+0

@FerdinandGaspar - 嗨,不幸的是,我不能提供样本数据,因为它的PHI – user8611702

+0

可以是一些组成样本,但具有相同的数据类型 –

如果开始日期和结束日期是不是在一个月的水平相等,用cov_prd_strt_dt开始日期,并得到其月结束日期为结束日期,并有cov_prd_end_dt月份开始日期为其他行的开始日期和cov_prd_end_dt结束日期分割的日期

SELECT cov_prd_strt_dt strt_dt, 
     CASE WHEN DATE_PART('Month', cov_prd_strt_dt) <> DATE_PART('Month', cov_prd_end_dt) 
      THEN LAST_DAY(cov_prd_strt_dt) 
      ELSE cov_prd_end_dt 
     END end_dt 
    FROM billing_fact 
UNION 
SELECT CASE WHEN DATE_PART('Month', cov_prd_strt_dt) <> DATE_PART('Month', cov_prd_end_dt) 
      THEN DATE_TRUNC(cov_prd_end_dt) 
      ELSE cov_prd_strt_dt 
     END strt_dt, 
     cov_prd_end_dt end_dt, 
    FROM billing_fact 

使用UNION只将消除那些不为分裂(同一个月cov_prd_strt_dt和cov_prd_end_dt)处理重复的记录。

+0

上面查询不工作抛出错误^找到“FROM”(在字符387)期待标识符找到关键字 – user8611702

+0

我正在Netezza数据库上工作。 Netezza不支持DATE_TRUNC逻辑我猜 – user8611702

+0

对不起,在FROM之前的第二个查询中有一个额外的逗号 –

一个或两个结果行的好答案。一般情况下,加入会在性能/关系思维以及代码可读性方面做得更好,(我知道最后一点可以是意见的问题,但绝不会重要)

首先我创建与所有相关个月临时表(但我想你应该有一个类似的表自己的话):

Create temp table months as 
Select distinct substr(cov_prd_strt_dt,1,7) yyyy_mm 
Union 
Select distinct substr(cov_prd_end_dt,1,7) yyyy_mm 

然后到实际的加盟:

Select 
    *, 
    substr(cov_prd_start_dt,1,7) start_yyyy_mm, 
    substr(cov_prd_end_dt,1,7) end_yyyy_mm 
From billing_fact f 
Join months m 
    On m.yyyy_mm between f.start_yyyy_mm and f.end_yyyy_mm 

我希望这有助于