2017-01-03 3 views
1

Ich habe die folgende Tabelle: Ich habe auch eine Kalender-Tabelle, wenn nötig.Oracle: Erstellen eines Bereichs im Monat zwischen zwei Daten

ID Start_dt   End_dt 
1  1/9/2016   3/10/2016 

Erwartete Ausgabe:

ID Start_dt  End_dt   Month ActiveCustomerPerMonth 
1  1/9/16  3/10/2016 201601   1 
1  1/9/16  3/10/2016 201602   1 
1  1/9/16  3/10/2016 201603   0 (Not Active end of Month) 

Ich brauche das, wie ich auf einer aktuellen Abfrage bin arbeiten, die eine Case-Anweisung zu zählen, wenn der Kunde für diesen Monat aktiv war nutzen werden. Wenn das Mitglied am letzten Tag des Monats aktiv war, gilt das Mitglied für diesen Monat als aktiv. Aber ich muss für diesen Kunden monatelang rechnen können.

CASE 
    WHEN LAST_DAY(x.END_DT) = x.END_DT 
     THEN '1' 
    WHEN TO_CHAR(X.END_DT,'MM/DD/YYYY') != '01/01/3000' 
     OR X.DISCHARGE_REASON IS NOT NULL 
     THEN '0' 
    WHEN X.FIRST_ASSGN_DT IS NULL 
     THEN '0'  
    ELSE '1' 
    END ActiveMemberForMonth 

Ich bin neu in Oracle und lese über eine Verbindung von, aber nicht verstehen, den Prozess und nicht sicher, ob dies der richtige Ort nutzen würde.

+1

?? Bitte erläutern Sie die Anforderung genauer. Anscheinend haben Sie ein Startdatum und ein Enddatum, und Sie versuchen, mehrere Zeilen mit einem neuen "Monat" -Wert zu erzeugen ... aber was sind die Regeln? In Ihrem Beispiel sind die Daten von Januar bis Mai 2016, aber die Monate sind von Januar bis März. Was ist die Geschäftslogik dort? – mathguy

+0

@mathguy Ich habe meine Frage aktualisiert, um die richtigen Daten zu reflektieren. Ich versuche, die Anzahl der aktiven Mitglieder pro Monat basierend auf der Logik meiner Fallanweisung zu ermitteln, muss aber feststellen, ob dieses Mitglied in diesem Monat aktiv war. Wenn das Mitglied am Ende des Monats aktiv war, wird dieses Mitglied für diesen Monat als aktiv betrachtet. – Toby

+0

Irgendwelche Ideen oder Feedback? – Toby

Antwort

1

So etwas Ähnliches.

with 
    test_data (id, start_dt, end_dt) as (
     select 1, to_date('1/9/2016' , 'mm/dd/yyyy'), to_date('3/10/2016', 'mm/dd/yyyy') 
                     from dual union all 
     select 2, to_date('1/23/2016', 'mm/dd/yyyy'), to_date('5/31/2016', 'mm/dd/yyyy') 
                     from dual 
    ) 
-- end of test data; solution (SQL query) begins below this line 
select id, start_dt, end_dt, 
     to_char(add_months(trunc(start_dt, 'mm'), level - 1), 'yyyymm') as mth, 
     case when end_dt < last_day(end_dt) 
      and level = 1 + months_between(trunc(end_dt, 'mm'), trunc(start_dt, 'mm')) 
      then 0 else 1 end as active_at_month_end 
from test_data 
connect by level <= 1 + months_between(trunc(end_dt, 'mm'), trunc(start_dt, 'mm')) 
     and prior id = id 
     and prior sys_guid() is not null 
order by id, mth -- optional 
; 

ID START_DT END_DT  MTH ACTIVE_AT_MONTH_END 
--- ---------- ---------- ------ ------------------- 
    1 2016-01-09 2016-03-10 201601     1 
    1 2016-01-09 2016-03-10 201602     1 
    1 2016-01-09 2016-03-10 201603     0 
    2 2016-01-23 2016-05-31 201601     1 
    2 2016-01-23 2016-05-31 201602     1 
    2 2016-01-23 2016-05-31 201603     1 
    2 2016-01-23 2016-05-31 201604     1 
    2 2016-01-23 2016-05-31 201605     1 

8 rows selected. 
+0

Ich bekomme nicht die richtigen Ergebnisse auf mich Ende. Ich habe die Case-Anweisung für jetzt entfernt, aber unten ist meine Abfrage. Zum Beispiel hat ID 5776 ein Startdatum vom 15.01.2013 Enddatum vom 30.11.2016 und meine Rückmeldungsergebnisse ändern sich nicht. – Toby

+0

WITH ActiveMemberData (CLT_CLT_PGMID, Startdatum, Enddatum) AS ( SELECT DISTINCT x.CLT_CLT_PGMID, TO_DATE (x.start_dt, 'TT/MM/JJ') AS Startdatum, TO_DATE (x.end_dt, 'TT/MM/JJ') AS EndDate FROM ROSALIND.LTIH_PROGRAM_HIST X LEFT CONTACTS JOIN D = ON X.ID D.ID wobei 1 = 1 UND ID = '5776') DISTINCT ID SELECT, Startdate, EndDate FROM ActiveMemberData WHERE 1 = 1 CONNECT BY LEVEL <= 1 + MONTHS_BETWEEN (TRUNC (Enddatum, 'MM'), TRUNC (Startdatum, 'MM')) UND PRIOR ID = ID AND PRIOR sys_guid() ist NICHT NULL – Toby

+0

Was meinen Sie mit "Ich bekomme nicht die richtigen Ergebnisse"? Was ** bekommst du, dass das falsch ist? – mathguy

Verwandte Themen