2017-09-14 5 views
0

J'ai le code SQL suivant, et j'ai besoin de diviser une ligne en deux lignes si 'COV_PRD_STRT_DT' et 'COV_PRD_END_DT' sont des mois différents.Comment écrire une instruction split dans SQL, qui divise un enregistrement en 2 enregistrements si les mois sont différents pour les dates de début et de fin?

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 

grâce

+2

pouvez-vous montrer quelques exemples de données et le résultat attendu? –

+0

@FerdinandGaspar - Salut, malheureusement, je ne peux pas fournir des données de l'échantillon car il est PHI – user8611702

+0

peut être un échantillon composé mais de mêmes types de données –

Répondre

0

Si la date de début et de fin n'est pas égale au niveau du mois, utilisez cov_prd_strt_dt comme date de début et d'obtenir sa date de fin de mois comme date de fin et ont la date de début du mois de cov_prd_end_dt comme l'autre la date de début de ligne et cov_prd_end_dt comme date de fin de diviser les dates

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 

Utilisation UNION n'éliminent les doublons pour ceux qui ne sont pas traitées pour deux parties (même mois pour cov_prd_strt_dt et cov_prd_end_dt).

+0

ci-dessus la requête ne fonctionne pas me lance^"FROM" (au 387) attend un identifiant trouvé un mot-clé – user8611702

+0

Je travaille sur la base de données Netezza. Netezza ne supporte pas la logique DATE_TRUNC Je suppose que – user8611702

+0

désolé, il y avait une virgule supplémentaire sur la deuxième requête avant de –

0

Belles réponses pour une ou deux lignes résultantes. Le cas général, une jointure fera un meilleur travail, en performance/réflexion relationnelle ainsi que la lisibilité du code (je sais que le dernier point peut être une question d'opinion, mais il est toujours important)

une table temporaire avec tous les mois concernés (mais je suppose que vous devez avoir une table semblable vous déjà):

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 

ensuite à la réelle rejoindre:

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 

J'espère que cette aide