Announcement

Collapse
No announcement yet.

Lösung über case?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Lösung über case?

    Hallo zusammen,

    ich habe folgendes Problem, ich muss herrausfinden, wann ein Kunde ein'Betreuter' Kunde gewesen ist.

    Dazu muss ich folgende Tabelle auswerten.

    ID_1 ID_2 Kd.Nr. von bis
    689669 666412 10000001 01.10.2009 31.12.2009
    783210 740830 10000001 01.01.2010 31.03.2010
    909226 833816 10000001 01.04.2010 30.06.2010
    1005686 894885 10000001 01.07.2010 30.09.2010
    1088564 975692 10000001 01.10.2010
    251176 932754 10000002 01.07.2010 30.09.2010
    251176 244255 10000002 01.04.2009 30.06.2010
    1106456 993659 10000002 01.10.2010
    360856 345250 10000003 01.04.2009

    Die o.a. Datensätze sollte dann z.b. so ausschauen, wobei Q für Quartal steht


    kd.Nr. Q1 Q2 Q3 Q4
    10000001 x x x x
    10000002 x x x
    10000003 x x


    Leider komme ich sogar nicht weiter. Denke, dass die Lösung über case führen wird, doch leider fehlt mir schon der gedankliche Ansatz.

    Vielen dank schon mal im Voraus

    Viele Grüße

    Martin

  • #2
    Ich glaub richtig heftig wirds erst, wenn die Datumseinträge über mehrere Quartale gehen. An der Stelle würde ich vielleicht generell über eine Stored Procedure nachdanken.

    Comment


    • #3
      Ganz unflexibel über hartcodierte Quartalsgrenzen codiert:
      Code:
      WITH data AS
        (SELECT 10000001 knr, to_date('01.10.2009','DD.MM.YYYY') s_dat, to_date('31.12.2009','DD.MM.YYYY') e_dat FROM dual UNION ALL 
         SELECT 10000001 knr, to_date('01.01.2010','DD.MM.YYYY') s_dat, to_date('31.03.2010','DD.MM.YYYY') e_dat FROM dual UNION ALL 
         SELECT 10000001 knr, to_date('01.04.2010','DD.MM.YYYY') s_dat, to_date('30.06.2010','DD.MM.YYYY') e_dat FROM dual UNION ALL 
         SELECT 10000001 knr, to_date('01.07.2010','DD.MM.YYYY') s_dat, to_date('30.09.2010','DD.MM.YYYY') e_dat FROM dual UNION ALL 
         SELECT 10000002 knr, to_date('01.07.2010','DD.MM.YYYY') s_dat, to_date('30.09.2010','DD.MM.YYYY') e_dat FROM dual UNION ALL 
         SELECT 10000002 knr, to_date('01.04.2009','DD.MM.YYYY') s_dat, to_date('30.06.2010','DD.MM.YYYY') e_dat FROM dual)
        SELECT KNR, s_dat, e_dat,
               CASE WHEN s_dat <= to_date('01.01.2009','DD.MM.YYYY') AND e_dat >= to_date('31.03.2009','DD.MM.YYYY') THEN 'x' END Q1_2009,
               CASE WHEN s_dat <= to_date('01.04.2009','DD.MM.YYYY') AND e_dat >= to_date('30.06.2009','DD.MM.YYYY') THEN 'x' END Q2_2009,
               CASE WHEN s_dat <= to_date('01.07.2009','DD.MM.YYYY') AND e_dat >= to_date('30.09.2009','DD.MM.YYYY') THEN 'x' END Q3_2009,
               CASE WHEN s_dat <= to_date('01.10.2009','DD.MM.YYYY') AND e_dat >= to_date('31.12.2009','DD.MM.YYYY') THEN 'x' END Q4_2009
         FROM data; 
      
             KNR     S_DAT    E_DAT    Q1_2009 Q2_2009 Q3_2009 Q4_2009
      ---------- ---------- ---------- ------- ------- ------- -------
        10000001 01.10.2009 31.12.2009                               x      
        10000001 01.01.2010 31.03.2010                                
        10000001 01.04.2010 30.06.2010                                
        10000001 01.07.2010 30.09.2010                                
        10000002 01.07.2010 30.09.2010                                
        10000002 01.04.2009 30.06.2010               x       x       x
      Das Quartal kann man dann ggf. dynamisch abrufen wie in
      Code:
      SELECT to_char(sysdate,'Q')  quart FROM dual;
      
      quart
      ------
           4

      Comment


      • #4
        Aber wenn von bis länger als 1 Quartal geht wirds schwierig in SQL würde ich sagen. Aber to_char mit 'Q' kannte ich noch nicht. Cooles Feature wenn man das mal braucht.

        Comment


        • #5
          hallo Jum,

          vielen Dank für Deine Hilfe!

          Habe es noch über
          [highlight=sql]select distinct (mr.knr),a.q1,a.q2,a.q3,a.q4 from temp051110mr mr,
          (select max(Q1_2010)as Q1,max(Q2_2010)as Q2,max(Q3_2010)as Q3,max(Q4_2010) as Q4,knr from temp051110mr group by knr)a
          where a.knr=mr.knr;[/highlight]

          zusammen gefasst.

          Nun noch mal eine vernünftige QS und ich danke Dir nochmals;-)

          Gruß

          Martin

          Comment


          • #6
            Originally posted by fanderlf View Post
            Aber wenn von bis länger als 1 Quartal geht wirds schwierig in SQL würde ich sagen. Aber to_char mit 'Q' kannte ich noch nicht. Cooles Feature wenn man das mal braucht.
            Hallo fanderlf,

            Habe es mal mit einem unendlichem Enddatum(Datum =null) versucht
            E scheint zu klappen, oder verstehe ich Dich nicht richtig und die Auswertung ist nicht richtig, wenn ein Zeitraum über mehrere Quartale hinweg geht.
            Das kommt auch vor.

            [highlight=sql]WITH data AS
            (SELECT 10000001 knr, to_date('01.10.2009','DD.MM.YYYY') s_dat, to_date('31.12.2009','DD.MM.YYYY') e_dat FROM dual UNION ALL
            SELECT 10000001 knr, to_date('01.01.2010','DD.MM.YYYY') s_dat, to_date('31.03.2010','DD.MM.YYYY') e_dat FROM dual UNION ALL
            SELECT 10000001 knr, to_date('01.04.2010','DD.MM.YYYY') s_dat, to_date('30.09.2010','DD.MM.YYYY') e_dat FROM dual UNION ALL
            SELECT 10000001 knr, to_date('01.07.2010','DD.MM.YYYY') s_dat, to_date('30.09.2010','DD.MM.YYYY') e_dat FROM dual UNION ALL
            SELECT 10000002 knr, to_date('01.07.2010','DD.MM.YYYY') s_dat, to_date('30.09.2010','DD.MM.YYYY') e_dat FROM dual UNION ALL
            SELECT 10000002 knr, to_date('01.04.2009','DD.MM.YYYY') s_dat, to_date('30.06.2010','DD.MM.YYYY') e_dat FROM dual UNION ALL
            SELECT 10000003 knr, to_date('01.04.2009','DD.MM.YYYY') s_dat, to_date(NVL('','30.06.2099'),'DD.MM.YYYY') e_dat FROM dual)
            SELECT knr ,s_dat,NVL(e_dat,'30.06.2099') as e_dat,
            CASE WHEN s_dat <= to_date('01.01.2010','DD.MM.YYYY') AND NVL(e_dat,'30.06.2099') >= to_date('31.03.2010','DD.MM.YYYY') THEN 'x' END Q1_2010,
            CASE WHEN s_dat <= to_date('01.04.2010','DD.MM.YYYY') AND NVL(e_dat,'30.06.2099') >= to_date('30.06.2010','DD.MM.YYYY') THEN 'x' END Q2_2010,
            CASE WHEN s_dat <= to_date('01.07.2010','DD.MM.YYYY') AND NVL(e_dat,'30.06.2099') >= to_date('30.09.2010','DD.MM.YYYY') THEN 'x' END Q3_2010,
            CASE WHEN s_dat <= to_date('01.10.2010','DD.MM.YYYY') AND NVL(e_dat,'30.06.2099') >= to_date('31.12.2010','DD.MM.YYYY') THEN 'x' END Q4_2010
            FROM data;[/highlight]


            Viele Grüße und danke für Deinen Einwand

            Martin

            Comment


            • #7
              Aso ja mit der unteren Lösung dürfts wohl schon funktionieren Die Lösung funktioniert halt für die Fälle dass der entsprechende Mitarbeiter mindestens das ganze Quartal gearbeitet hat. Wenn er nur einen Teil davon gearbeitet hat funktionierts nicht mehr.

              Comment


              • #8
                Hallo,

                das schöne ist, dass es immer bis zum Quartalsende geht.

                Danke Euch Beiden.

                Schönes Wochenende

                Viele Grüße

                Martin

                Comment

                Working...
                X