Announcement

Collapse
No announcement yet.

Differenz zweier Werte mit unterschiedlichem Datum.

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

  • Differenz zweier Werte mit unterschiedlichem Datum.

    Hallo zusammen!

    Ich versuche gerade folgendes Problem zu lösen: und zwar sehen die Datensätze wie folgt aus: Seriennummer;Zähler;Datum. Nun gibt es jeden Tag zu jeder Seriennummer einen neuen Datensatz. Ich möchte jetzt hinter dem Datensatz von heute die Zählerdifferenz zu dem letzten Datensatz der Seriennummer schreiben. Ok, ich habe es wohl etwas umständlich beschrieben

  • #2
    Soll das jetzt bei einer Abfrage passieren oder fix in der Tabelle stehen?
    Wenn nur innerhalb einer Abfrage:

    select Seriennummer, Zähler, Datum, Zähler - IsNull((select top 1 t2.Zähler from tabelle t2 where t2.Seriennummer = t1.Seriennummer and t2.Datum < t1.Datum order by t2.datum desc), 0) as Differenz from tabelle t1

    Wenn der Wert aber in der Tabelle selber stehen soll, kann man das als normale Spalte anlegen und per INSERT-Trigger füllen lassen. Oder man verwendet eine berechnete Spalte (computed column), dann errrechnet sich die Datenbank die Differenz automatisch immer selber. Da man aber bei berechneten Spalten keine Unterabfragen verwenden darf, muss man dazu eine UDF verwenden, die anhand der Parameter die Differenz errechnet und zurückgibt. Diese Variante liefert zwar selbst dann einen korrekten Wert, wenn später mal eine Zeile mittendrin gelöscht werden würde, aber dieses aktuelle Berechnen geht natürlich ziemlich auf die Performance, soll man also nur machen, wenn man das wirklich braucht.

    bye,
    Helmut

    Comment


    • #3
      AW

      Hallo Helmut,
      danke für deine Antwort. Ich möchte das Ergebnis gern in die Tabelle schreiben. Mir ist die Vorgehensweise bzw. die Syntax noch nicht ganz klar wie ich das mit dem datum regeln soll. Ich hade ja z.B zur Seriennummer P12A am 10.11.2009 den Zähler 112341 und P12A am 9.11.2009 den Zähler 112300 . Jetzt möchte ich hinter dem Datensatz vom 10.11 die Differenz stehen haben. Ein weiteres Problem ist, dass ich nicht unbedingt jeden Tag einen Datensatz habe. Es können auch schon mal zwei oder drei Tage dazwischen liegen.

      Danke Gruß
      martin_s

      Comment


      • #4
        Warum probierst und studierst du nicht einfach mal meine Query? Damit sollte zumindest die Logik klar werden (und dass es egal ist, wieviele Tage dazwischenliegen oder ob überhaupt vorher schon was war).
        Dann musst du dich noch entscheiden, ob in der Tabelle eine normale Spalte steht, die per Trigger gesetzt wird, oder ob du eine berechnete Spalte verwenden willst (Vor- und Nachteile habe ich ja schon beschrieben).

        bye,
        helmut

        Comment


        • #5
          Re:

          Hallo Helmut,
          Deinen Query habe ich ausprobiert und er liefert mir auch das gewünschte Ergebnis. Nur was ich noch nicht ganz verstanden habe ist, ob ich das auch innerhalb einer Tabelle kann, oder ob ich wie in dem Query mit zwei Tabellen arbeiten muß.

          Gruß
          martin_s

          Comment


          • #6
            Was willst du machen - Trigger oder berechnete Spalte? Aber im Prinzip egal, diese Query brauchst du dazu in dieser Art so und so.

            bye,
            Helmut

            Comment


            • #7
              Re

              Ich möchte das gern per Trigger lösen. Also muß ich die Tabelle vorher duplizieren, damit das auch funktioniert?
              Ich habe es so versucht, komme da aber gerade nicht so richtig weiter.

              create trigger test_trigger
              on t1
              for insert,update as
              DECLARE @diff numeric
              set @diff = (
              select DEVICE_ID,PRINTED_PAGE_TOTAL,RESERVED_COLUMN3,PRIN TED_PAGE_TOTAL-
              IsNull((select top 1 t2.PRINTED_PAGE_TOTAL from t2
              where t2.DEVICE_ID=t1.DEVICE_ID and t2.RESERVED_COLUMN3<t1.RESERVED_COLUMN3
              order by t2.RESERVED_COLUMN3 desc),0) from t1 )
              begin
              update t1
              set SEITENPROTAG =@diff
              end
              go




              Gruß

              martin_s
              Zuletzt editiert von martin_s; 17.11.2009, 18:04.

              Comment


              • #8
                Hallo Martin,

                ich weiß nicht recht wie ich es sagen soll, aber was du da als Vorschlag für den Trigger zeigst lässt mich befürchten, dass dir noch so einiges an Grundlagen fehlt und ich dir daher diesen Trigger komplett ausprogrammieren müsste und du wieder nichts weisst, warum, wie und was. Alleine die Wertzuweisung auf eine Variable mit einem Select mit 4 Werten (welches soll denn jetzt in die Variable?) und ein update-Statement ohne where-Klauses (das somit ALLE Datensätze auf einen Schlag ändert) sind Grundlagenfehler, wenn man das nicht drauf hat sollte man sich erst mal damit auseinandersetzen. Man beginnt den Hausbau ja auch mit dem Fundament und nicht mit dem ersten Stock. Von diesen Sachen abgesehen gibt es nämlich noch einiges mehr, mit dem man in einem Trigger zu tun bekommt und ich kann hier zwar etwas Hilfe in konkreten Fragen anbieten aber keine Schulung machen.

                hoffe du bist mir deswegen nicht böse,
                Helmut

                Comment


                • #9
                  Re

                  Hallo Helmut,

                  wie könnte ich? Mir ist ja bewusst das du Recht hast.
                  Werde mich ersteinmal mit den Grundlagen beschäftigen.

                  Gruß
                  martin_s

                  Comment

                  Working...
                  X