2017-09-14 69 views
0

我有以下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

可以是一些組成樣本,但具有相同的數據類型 –

回答

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之前的第二個查詢中有一個額外的逗號 –

0

一個或兩個結果行的好答案。一般情況下,加入會在性能/關係思維以及代碼可讀性方面做得更好,(我知道最後一點可以是意見的問題,但絕不會重要)

首先我創建與所有相關個月臨時表(但我想你應該有一個類似的表自己的話):

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 

我希望這有助於

相關問題