Announcement

Collapse
No announcement yet.

Select

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

  • Select

    Hallo,

    ich bräuchte für meine SQLServer 2008 eine kleine Auswertung. Vielleicht kann mir wer weiterhelfen:

    Ausgangslage:
    Code:
    create table TestTab (
       Id                   numeric              null,
       MAId                 numeric              null,
       GueltigAb            date                 null,
       Satz                 decimal(5,2)         null
    )
    go
    
    insert into TestTab values( 1, 1, '2012-01-01', 7 )
    go
    insert into TestTab values( 2, 1, '2013-01-01', 8 )
    go
    insert into TestTab values( 3, 1, '2014-01-01', 9 )
    go
    insert into TestTab values( 4, 1, '2015-01-01', 10 )
    go
    insert into TestTab values( 5, 1, '2016-01-01', 11 )
    go
    Herauskommen sollte:
    Code:
    select MAId, GültigAb, GültigBis, Satz from TestTab 
    
    1     01.01.2012     31.12.2012      7
    1     01.01.2013     31.12.2013      8
    1     01.01.2014     31.12.2014      9
    1     01.01.2015     31.12.2015     10
    1     01.01.2016     Tagesdatum     11
    bzw:
    Code:
    select MAId, GültigAb, GültigBis, Satz from TestTab where MAId = 1 AND :datum between GültigAb and GültigBis
    
    1     01.01.2014     31.12.2014      9

    Danke für die Unterstützung

  • #2
    Deine Ausgangstabelle hat keine Column GültigBis?
    Und woher kommt datum?
    Christian

    Comment


    • #3
      Hallo Christian,

      genau das ist mein Problem. Das GültigBis sollte ich aus dem nächsten Datensatz ergeben.

      vg

      Comment


      • #4
        Aus Deiner Datenliste ließe sich ableiten, dass das 2. Datum mit folgender MSSQL Funktion abgeleitet werden kann
        SELECT dateadd(day,-1(DATEADD(year, 1, GueltigAb ))
        Wie das allerdings in der Where Clause ablaufen soll, da reicht meine Fantasie nicht.
        Gruß, defo

        Comment


        • #5
          Das funktioniert doch nur, solange gültigBis immer genau ein Jahr ist?
          Christian

          Comment


          • #6
            Originally posted by defo View Post
            Aus Deiner Datenliste ließe sich ableiten, dass das 2. Datum mit folgender MSSQL Funktion abgeleitet werden kann
            SELECT dateadd(day,-1(DATEADD(year, 1, GueltigAb ))
            Wie das allerdings in der Where Clause ablaufen soll, da reicht meine Fantasie nicht.
            Hallo Defo,

            das GueltigBis soll sich aus dem GueltigAb des nächsten Datensatzes ergeben.

            Also bei meinem Beispiel steht im Id 1 das ( GueltigAb - 1 Tag ) des Id 2.

            vg

            Comment


            • #7
              Originally posted by Urwi View Post
              Hallo Defo,

              das GueltigBis soll sich aus dem GueltigAb des nächsten Datensatzes ergeben.

              Also bei meinem Beispiel steht im Id 1 das ( GueltigAb - 1 Tag ) des Id 2.

              vg
              Dazu musst du Analytic Function (Windows Functions unter MSSQL) verwenden, um das Datum bzw. erstmal den richtigen Nachfolgedatensatz zu bestimmen
              so ungefähr:
              LEAD(GueltigAb, 1,0)-1 OVER (ORDER BY GueltigAb) AS GültigBis
              Gruß, defo

              Comment


              • #8
                Hallo Defo,

                ich weiß aus Oracle von solchen Analyse-Funktionen, aber wirklich verstanden habe ich die nie.

                Lead wird mit einem Fehler quittiert ('LEAD' wird nicht als Name einer integrierten Funktion erkannt) Aber ich werde in diese Richtung weitersuchen.

                vg

                Comment


                • #9
                  Originally posted by Urwi View Post
                  Hallo Defo,

                  ich weiß aus Oracle von solchen Analyse-Funktionen, aber wirklich verstanden habe ich die nie.

                  Lead wird mit einem Fehler quittiert ('LEAD' wird nicht als Name einer integrierten Funktion erkannt) Aber ich werde in diese Richtung weitersuchen.

                  vg
                  Diese Analyse Funktionen kann man sich einfach so vorstellen, dass sie es erlauben (unter anderem), auf den vorigen oder nächsten Datensatz zuzugreifen. Wie es bei Tabellenkalkulationen z.B. ganz normal ist. Genau deshalb benötigen diese Funktionen auch die Angabe einer Sortierung, weil es in SQL, das nur Mengen kennt, per Definition keine Reihenfolge gibt (nicht zu Verwechseln mit der Ausgabereihenfolge, die wahlfrei am Ende eines Selct Statement ebenfalls mit dem Order by angegeben wird.
                  Für Dich wäre vermutlich die Frage, ob die verwendete MSSQL Version das beherrscht, ab V 2008 gibt es einiges, ab V 2012 deutlich mehr. Falls das nicht zur Verfügung steht, gibt es häufig auch Workarounds für ältere Version. Diese Statements sind dann u.U. viel komplexer und nicht unbedingt, was eigentlich auch ein wichtiger Aspekt ist. sehr schnell und elegant im Ausführungsplan.
                  Wenn Du dazu was suchst, Oracle hat das im wesentlichen schon seit Version 8 implementiert und es gibt mittlerweile häufig Blogs, die entsprechende Workarounds aus der "Wechsler" Perspektive behandeln. Also suchen nach "Oracle Lead for MSSQL 2008" oder so ..
                  Gruß, defo

                  Comment


                  • #10
                    Hallo defo,

                    Danke für deine Erläuterung!

                    Einfachheitshalber habe ich bei der Erfassung das Gültig bis Datum hinzugefügt. Ein Blick in die Tabelle hat mir gezeigt, dass da nicht viel nacherfasst werden muss und ich kann die Abfrage elegant und ohne Umwege gestalten.

                    vg

                    Comment


                    • #11
                      Hallo,

                      solange es sich nicht um riesige Datenmengen handelt (was MaID nahelegt :-) ) bin ich auch mal für quick & dirty:

                      [highlight=sql]
                      SELECT
                      MaID,
                      gueltigAB,
                      (SELECT DateAdd(d,-1,Min(gueltigAB))
                      FROM TestTab TT2
                      WHERE TT2.MAId = TT.MAID AND TT2.GueltigAb > tt.GueltigAb
                      ) AS GueltigBis,
                      Satz
                      FROM TestTab TT
                      ORDER BY MAId, GueltigAb
                      [/highlight]

                      Ich habe das bei einem Kollegen mal gesehen und staune selbst immer, wie schnell MSSQL mit solchen Unterabfragen umgeht.
                      Wir nutzen sie inzwischen sogar als JOIN - Bedingung.
                      Wie gesagt, allerdings nur wenn man von vornherein abschätzen kann, dass man keine Millionen Datensätze haben wird.

                      [highlight=sql]
                      SELECT
                      TT.MaID,
                      TT.gueltigAB,
                      DateAdd(d,-1,TT2.GueltigAb) AS GueltigBis,
                      TT.Satz
                      FROM TestTab TT
                      LEFT JOIN TestTab TT2 ON TT2.MAId = TT.MAID AND
                      TT2.GueltigAb = (SELECT min(GueltigAb) FROM TestTab TT3 WHERE TT3.MAId = TT.MAId AND TT3.GueltigAb > TT.GueltigAb)
                      ORDER BY TT.MAId, TT.GueltigAb
                      [/highlight]

                      Bei der Join - Variante muss man allerdings sicherstellen, dass GueltigAB pro MaID tatsächlich eindeutig ist, sonst erhält man doppelte Sätze.

                      Viele Grüße
                      Tino


                      Code:
                      MaID	gueltigAB	GueltigBis	Satz
                      1	2012-01-01	2012-12-31	7.00
                      1	2013-01-01	2013-12-31	8.00
                      1	2014-01-01	2014-12-31	9.00
                      1	2015-01-01	2015-12-31	10.00
                      1	2016-01-01	NULL	        11.00
                      Zuletzt editiert von tinof; 04.11.2016, 18:37.
                      Ich habs gleich!
                      ... sagte der Programmierer.

                      Comment


                      • #12
                        Hallo Tinof,

                        sensationell!

                        Jetzt wo ich das sehe, frage ich mich, warum man da nicht selbst draufkommt

                        Gültig ab ist für jeden MAId eindeutig und da es da um Stundensätze geht, ist die Anzahl der Datensätze auch überschaubar.

                        Danke!

                        Comment


                        • #13
                          Originally posted by Urwi View Post
                          Jetzt wo ich das sehe, frage ich mich, warum man da nicht selbst draufkommt
                          .. ist (leider) auch nicht auf meinem Mist gewachsen, habe ich nur "mit den Augen gestohlen"...

                          Schön, wenn es funktioniert!

                          Viele Grüße
                          Tino
                          Ich habs gleich!
                          ... sagte der Programmierer.

                          Comment

                          Working...
                          X