Announcement

Collapse
No announcement yet.

SQL Datensätze zusammenführen

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

  • SQL Datensätze zusammenführen

    Hi!

    ich fang direkt an:
    ich habe 2 (bzw mehrere, aber so wirds anschaulich) Datensätze, die ich auf nur einen Datensatz abbilden möchte:

    USERID;PeriodNr;PeriodStart;PeriodFinish;Montag;Di enstag;Mittwoch;Donnerstag;Freitag
    1 | 10 | 26.09.10 | 01.10.10 | 20 | 30 | 40 | 10 | NULL
    1 | 11 | 01.10.10 | 03.10.10 | NULL | NULL | NULL | NULL | 50

    eine solche Userperiod geht im Normalfall von Sonntag bis Sonntag, jedoch wie hier beim Monatswechsel nur von Sonntag bis letzten Tag des Monats.

    Was ich furchtbar gerne hätte wäre jetzt folgende Ergebniszeile:
    UserID;ersterTagderWoche;letzterTagderWoche;KW;Mon tag;Dienstag;Mittwoch;Donnerstag;Freitag
    1 | 26.09.10 | 03.10.10 | 39 | 20 | 30 | 40 | 10 | 50

    Ich denke/hoffe, ist klar geworden? Geht das?

    Habe schon viel probiert, aber ich komme einfach nicht mehr weiter. Ich hoffe sehr, dass das überhaupt möglich ist.

    Vielen vielen Dank für jede hilfreiche Anregung.

  • #2
    Code:
    ... Habe schon viel probiert, aber ich komme einfach nicht mehr weiter...
    Was hast du denn schon alles probiert ?

    Vor allem lässt die Frage offen, ob man die Daten in der Tabelle selber dauerhaft ändern soll oder ob man zB. die Originaldaten nicht angreifen will sondern nur eine Sicht braucht, die das "korrigierte" Ergebnis liefert.
    In jedem Fall nicht einfach, da man Wochenbereiche ermitteln muss, dann schauen, welche Datensätze nicht an einem Wochenanfang liegen und deren Werte auf den entsprechenden Datensatz aufaddieren usw.
    Außerdem hängt die Umsetzung von der verwendeten Datenbank ab, die du uns nicht genannt hast.

    bye,
    Helmut

    Comment


    • #3
      Oh, sry!

      ich habe die Daten in einer Ora10g Datenbank gespeichert. Ich führe einen Select darauf ab mit den obigen Ergebniszeilen und schreibe sie in eine Textdatei.

      Nun verwende ich diese Textdatei in einer Access Datenbank. Am schönsten wäre es für mich, die Daten direkt so wie ich sie gerne hätte in die Textdatei zu schreiben...zur Not könnte ich aber auch eine Abfrage der Originaldaten(der Textdatei) erstellen.

      Probiert habe ich verschiedene SQL Varianten, gänzlich und kläglich gescheitert. Und PLSQL habe ich zu wenig Ahnung leider.
      Ich könnte ja auf jeden Fall schauen ob PeriodFinish-PeriodStart < 7 ist, und wenn periodFinish der letzte Monatstag ist, dann ist PeriodFinish das PeriodFinish der nächsten PeriodNr.
      Aber wie ich diese 2 Datensätze dann zu einem zusammenfüge...leider keinen Ansatz

      Comment


      • #4
        gebe Helmut recht.
        das in einem statement abzubilden ist zwar nicht unmöglich,
        aber doch recht umfangreich.

        Warum schreibst du dir keine funktion die dir einen solchen satzaufbau anhand eines IN_Parameters (die USERID) zurückliefert?

        Ist leichter zu lesen und wartbarer.


        greetz

        jogi

        Comment


        • #5
          Ok danke schonmal!

          So ganz verstanden was du meinst, habe ich leider nicht?! Eine PLSQL Funktion schreiben, die was macht?

          Ich müsste doch im Prinzip nur prüfen, ob die aktuelle Periode 7 Tage umfasst, und wenn nicht soll er die Werte der jeweils nächsten Period hinzuaddieren und PeriodFinish anpassen.
          Aber puuuh....

          Comment


          • #6
            Soo schlimm ist das ja auch nicht, als erster Ansatz:
            Code:
            WITH data AS
              (SELECT 1 USERID, 10 PeriodNr, to_date('26.09.10','DD.MM.RR') PeriodStart,  to_date('01.10.10','DD.MM.RR') PeriodFinish, 
                 20   Montag, 30   Dienstag, 40   Mittwoch, 10   Donnerstag, NULL Freitag FROM dual UNION ALL
               SELECT 1 USERID, 11 PeriodNr, to_date('01.10.10','DD.MM.RR') PeriodStart,  to_date('03.10.10','DD.MM.RR') PeriodFinish, 
                 NULL Montag, NULL Dienstag, NULL Mittwoch, NULL Donnerstag, 50   Freitag FROM dual)
             SELECT d1.USERID,
                    to_char(d2.PeriodFinish,'IW')    iso_woche,
                    d1.PeriodStart, 
                    d2.PeriodFinish,
                    NVL(d1.Montag,d2.Montag)         mo,
                    NVL(d1.Dienstag,d2.Dienstag)     di,
                    NVL(d1.Mittwoch,d2.Mittwoch)     mi,
                    NVL(d1.Donnerstag,d2.Donnerstag) do,
                    NVL(d1.Freitag,d2.Freitag)       fr
               FROM data d1, data d2 
              WHERE d1.PeriodFinish = d2.PeriodStart
                AND d1.PeriodNr + 1 = d2.PeriodNr
                AND d1.USERID       = d2.USERID;  
            
            USERID ISO_WOCHE PERIODSTART PERIODFINISH  MO  DI  MI  DO  FR
            --------------------------------------------------------------
                 1	      39  26.09.2010  03.10.2010   20  30  40  10  50

            Comment


            • #7
              Überragend, spitze, klasse, awesome! YEAH!

              An ein Union und dann NVL hätt ich ja in 100 Jahren nicht gedacht! GROßES Danke

              Jetzt ist nur noch die Frage, wie ich das einbaue!
              Momentaner stand ist eben ein Select, der die Daten wie oben aufführt und dann die Ergebniszeilen stur in die txt schreibt.

              Müsste jetzt quasi vor dem Schreiben prüfen, ob die Period durch einen Monatswechsel unterbrochen ist. Wenn nein: schreiben, Wenn ja: Aus diesen 2 Datensätzen irgendwie obigen Select ausführen und die eine Zeile schreiben.

              Ich könnte ja eine Art Funktion schreiben, der ich die UserID und die beiden PeriodNummern übergebe, und die anschließend eben diese Ergebnis bildet, in die Datei schreibt und Funktion wieder verlassen wird.

              Geht das? Gibts Einwände? Gehts einfacher? Ansätze? (Sry PLSQL hab ich leider keine Erfahrung, merkt man ja ganz offensichtlich )

              Comment


              • #8
                Guten Morgen!

                mir kam jetzt eine ordinäre Lösung in den Sinn!

                Code:
                WITH data AS
                  (SELECT 1 USERID, 10 PeriodNr, to_date('26.09.10','DD.MM.RR') PeriodStart,  to_date('01.10.10','DD.MM.RR') PeriodFinish, 
                     20   Montag, 30   Dienstag, 40   Mittwoch, 10   Donnerstag, NULL Freitag FROM dual UNION ALL
                   SELECT 1 USERID, 11 PeriodNr, to_date('01.10.10','DD.MM.RR') PeriodStart,  to_date('03.10.10','DD.MM.RR') PeriodFinish, 
                     NULL Montag, NULL Dienstag, NULL Mittwoch, NULL Donnerstag, 50   Freitag FROM dual)
                select d1.userid, to_char(d1.periodfinish, 'IW') KW, sum(d1.montag) Mo, sum(d1.dienstag) Di, sum(d1.mittwoch) Mi, sum(d1.donnerstag) Do, sum(d1.freitag) Fr
                from data d1
                group by d1.userid, to_char(d1.periodfinish, 'IW')
                
                USERID            KW MO                DI                MI                DO                FR                
                ----------------- -- ----------------- ----------------- ----------------- ----------------- ----------------- 
                1                 39 20                30                40                10                50
                Gibt es denn in Oracle eine Möglichkeit, aus einer KW den jeweils ersten und letzten Tag anzuzeigen? Dann wäre ich sehr glücklich, würde mir reichen!

                Comment


                • #9
                  Meine Frage konnte mir das Archiv erfolgreich beantworten

                  --> http://entwickler-forum.de/showthread.php?t=10165

                  So frage ich jetzt PeriodStart und PeriodFinish gar nicht erst ab, sondern nur die zugehörige KW und bilde mit dieser Funktion die PeriodStart und PeriodFinish entsprechend von der KW ab.

                  Klasse Forum!

                  Comment

                  Working...
                  X