Announcement

Collapse
No announcement yet.

Update

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

  • Update

    Hallo zusammen,

    ich möchte auf folgende Tabelle ein Update ziehen und zwar in der Logik, in der Spalte AFA den Wert Betrag zu setzen, wo die lfdnr dem wert nds entspricht:

    vorher:
    PK Jahr Betrag AfA LfdNr NDS
    809 2008 3000 0.00 3 11
    815 2010 0.00 0.00 9 17
    816 2010 0.00 0.00 10 18
    817 2010 0.00 0.00 11 19
    818 2010 0.00 0.00 12 20

    nachher:
    PK Jahr Betrag AfA LfdNr NDS
    809 2008 3000 0.00 3 11
    815 2010 0.00 0.00 9 17
    816 2010 0.00 0.00 10 18
    817 2010 0.00 3000 11 19
    818 2010 0.00 0.00 12 20

    Da dieses Update in eine Procedure eingebaut werden soll, bräuchte ich eine allgemeine Logik.

    Bin für jede Hilfestellung dankbar.

  • #2
    Hallo,

    der Befehl kann lauten (hängt natürlich auch von Deiner Datenbank ab):
    (Ich nenne Deine Tabelle einfach mal Tabelle).


    update Tabelle as x
    Set x.AFA=(select Tabelle.Betrag from Tabelle where Tabelle.NDS =x.lfdNr)
    where exists (select * from Tabelle where Tabelle.NDS =x.lfdNr)

    Gruß frauwue
    docendo discimus

    Comment


    • #3
      Hallo frauwue,

      danke für den Befehl. Wie wandele ich die Syntax auf SQL-Server 2005 ab?

      Gruß
      Kartanic

      Comment


      • #4
        Hallo Kartanic,

        der MSSQL mag kein Alias bei UPDATE, der Rest sollte aber gehen.

        [highlight=code]
        update Tabelle
        Set AFA=(select x.Betrag from Tabelle as x where x.NDS = Tabelle.lfdNr)
        where exists (select * from Tabelle as x where x.NDS =Tabelle.lfdNr)
        [/highlight]

        Alternative kannst Du auch mit einem Join arbeiten

        [highlight=code]
        update Tabelle
        Set Tabelle.AFA = x.Betrag
        FROM Tabelle
        INNER JOIN
        Tabelle AS X
        on x.NDS = Tabelle.lfdNr
        [/highlight]

        Gruß, Olaf
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          Hallo Olaf,

          vielen Dank jetzt funzt es. Ich habe noch ein zweites etwas diffizieleres Problem in diesem Zusammenhang:

          Das Feld Summe soll ein Update erfahren,d.h. zu den schon bestehenden Werten sollen neue Werte dazu addiert werden und zwar immer mit dem Betrag in der nächsten und übernächsten Zeile:

          vorher:
          PK Jahr Betrag Summe
          809 2008 3000 0.00
          815 2010 0.00 1000
          816 2010 0.00 1000
          817 2010 9000 0.00
          818 2010 0.00 0.00

          nachher:
          PK Jahr Betrag Summe
          809 2008 3000 0.00
          815 2010 0.00 4000
          816 2010 0.00 4000
          817 2010 9000 0
          818 2010 0.00 9000

          Vielleicht gibt es dazu auch noch eine Idee? Danke schonmal für Eure Hilfe.

          Comment


          • #6
            Hallo,

            ich bin in solchen Fällen eigentlich immer für Schritt-für-Schritt Lösungen, weil man dann auch ein paar Monate später noch versteht, was man gemacht hat. Hier also mein Vorschlag (SQL-Server):
            Code:
            create table #bla(PK int, Jahr int, Betrag money, Summe money)
            insert into #bla values(809, 2008, 3000, 0.00)
            insert into #bla values(815, 2010, 0.00, 1000)
            insert into #bla values(816, 2010, 0.00, 1000)
            insert into #bla values(817, 2010, 9000, 0.00)
            insert into #bla values(818, 2010, 0.00, 0.00)
            
            select * from #bla
            
            --Neue Tabelle mit identity und Markierungsspalte
            select identity(int, 1, 1) as ID, *, 0 as Mark
            into #temp
            from #bla
            order by PK
            
            --Immer drei zusammenhängende Datensätze markieren
            update #temp
            set Mark = ID % 3
            
            --Erstes Update bei Mark = 1 in bezug auf eine Zeile höher (b.ID = a.ID + 1)
            update b
            set Summe = a.Betrag + b.Summe
            --select * 
            from #temp a
            	inner join #temp b on b.ID = a.ID + 1
            where
            	a.Mark = 1
            
            --Zweites Update bei Mark = 1 in bezug auf zwei Zeilen höher (b.ID = a.ID + 2)
            update b
            set Summe = a.Betrag + b.Summe
            --select * 
            from #temp a
            	inner join #temp b on b.ID = a.ID + 2
            where
            	a.Mark = 1
            
            select PK, Jahr, Betrag, Summe
            from #temp 
            order by PK
            
            drop table #temp
            drop table #bla
            Es gibt da natürlich ein paar Dinge zu beachten, denn ist immer klar, dass die Bezugszeile für den Betrag immer ganz oben steht? Aber zumindest einen Ansatz sollte es sein.

            Viele Grüße
            Olaf

            Comment


            • #7
              Hallo Olaf,

              tausend Dank für die schnelle Hilfe, klappt richtig super. Ich habe nur noch zwei Fragen:

              1. Was kann man machen, wenn auf den Beträge in zwei aufeinanderfolgenden Zeilen stehn? Dann klappt die Markierung leider nicht mehr:
              insert into #bla values(809, 2008, 3000, 0.00)
              insert into #bla values(815, 2009, 500, 1000)
              insert into #bla values(816, 2010, 0.00, 1000)
              insert into #bla values(817, 2010, 9000, 0.00)
              insert into #bla values(818, 2010, 0.00, 0.00)


              2.
              In einer zweiten Tabelle habe ich immer einen veränderbaren Wert, z.B. Wert = 8 oder Wert = 5

              Ich will dann ausgehend vom Betrag die nachfolgenden Zeilen 8mal oder 5mal befüllen.

              Wie kann ich hier diesen Wert als Variable einbinden,d.h. die update statements in Abhängigkeit von diesem Wert 8mal oder 5mal ausführen?

              a.ID + 1

              a.ID + 2

              a.ID + ....

              a.ID + 8

              Viele Grüße
              Karsten
              Zuletzt editiert von Kartanic; 24.10.2007, 09:31.

              Comment


              • #8
                Hallo,

                zu 1.: Verstehe ich das richtig, dass allgemein ausgedrückt, alle Zeilen im Feld Summe upgedatet werden sollen, die im Feld Betrag den Wert 0 stehen haben, und zwar summiert um den Wert des ersten Datensatzes der "über" ihm steht, der im Feld Betrag einen Wert > 0 besitzt, bei aufsteigender Sortierung der gesamten Tabelle nach PK? Wenn es so ist, dann zeige ich Dir eine Lösung - wenn nicht, dann formuliere bitte eine genaue allgemeine Regel.

                zu 2.: Das habe ich leider nicht ganz verstanden. Wie verbinde ich die Tabelle Nr. 2 mit Tabelle Nr. 1 (join)? Wenn aber die Regel so ist, wie ich oben vermute, dann brauchst Du die (Hilfs)Tabelle zwei nicht.

                OK, also dann beschreibe das Ganze bitte nochmal genau! Sehr anschaulich ist es auch immer, wenn Du ein paar Beispieldaten mit angibst, wie Du es auch bei der ersten Fragestellung gemacht hast. (vor und nach Update)

                Gruß
                Olaf

                Comment


                • #9
                  Hallo Olaf,

                  habe jetzt dank Deiner tollen Vorarbeit noch eine Lösung gefunden.

                  Vielen Dank nochmals für die Hilfe.

                  Gruß
                  Karsten

                  Comment

                  Working...
                  X