Announcement

Collapse
No announcement yet.

Datensätze aus 2015 mit 2014 Werte in der selben Tabelle überschreiben

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

  • Datensätze aus 2015 mit 2014 Werte in der selben Tabelle überschreiben

    Hallo Zusammen,

    ich versuche schon seit Stunden eine Abfrage zu erstellen, in der Datensätze aus 2015 mit den Datensätze aus 2014 überschrieben werden. Dabei geht es nur um Datensätze aus 2015, die in den Spalten "VON" und "BIS" gleich Null sind.
    Vielleicht ist das Problem deutlicher, wenn ich die Tabelle beschreibe:

    Tabelle "Jahresuebersicht" mit 5 Spalten:

    Rechnungsjahr , Land, Gegenstand, VON, BIS

    Die Tabelle ist mit folgenden Datensätze befüllt:

    2014, Deutschland, Tisch, 1, 2
    2014, Deutschland, Stuhl, 2, 4
    2014, Italien, Tisch, 1, 3
    2015, Deutschland , Tisch, NULL, NULL
    2015, Deutschland, Stuhl, NULL, NULL
    2015, Italien, Tisch, NULL, NULL
    2015, Italien, Stuhl, 4, 5 ( Diese Datensätze müssen nicht angepasst werden, hier befinden sich schon werte in den Spalten "VON" und "BIS")

    Ich möchte lediglich , dass die "VON" und "BIS" Werte (Spalten) aus 2015, welche gleich NULL sind, befüllt werden mit den Werten aus 2014. Dabei muss aber das Land und der Gegenstand übereinstimmen.
    Ein Gegenstand kann in einem Land in einem Jahr nur 1 Mal vorkommen ... Aber den Gegenstand gibt es auch in anderen Ländern. Aber immer nur 1 Mal.
    Somit müssen 2 Bedingungen erfüllt werden:

    1. Das Land muss gleich sein
    2. Der Gegenstand muss gleich sein

    Die Datensätze "VON" und "BIS" sind immer entweder beide befüllt oder beide leer.

    Könnt ihr mir da bitte weiterhelfen??? Ich müsste sonst über 600 Datensätze händisch befüllen

  • #2
    Das Stichwort ist korreliertes Update. Die Umsetzung ist je nach RDBMS in einer anderen Syntax notwendig.
    z.b. so irgendwie (ungetestet)
    [highlight=sql]
    UPDATE t
    SET t.von = t14.von
    t.bis = t14.bis
    FROM mytable t
    JOIN mytable t14
    ON t14.land = t.land
    and t14.objekt = t.objekt
    where t14.jahr = 2014
    and t.jahr = 2015
    and t.von is null
    and t.bis is null;
    [/highlight]

    Ich empfehle zum Test eine Testdatenbank oder auf konkrete Länder und Gegenstände einzuschränken.
    Außerdem empfehle ich vor durchführung der Operation zu prüfen, ob die beschriebene Eindeutigkeit wirklich gegeben ist. Das kann entweder über SQL erfolgen (zählen) oder durch Überprüfung der Existenz entsprechender Constraints und Sicherstellen, dass sie aktiv sind.
    Gruß, defo

    Comment


    • #3
      Hallo Defo,

      wir arbeiten hier mit dem MS SQL Server 2008 und der Befehl funktioniert leider nicht ( Management Studio) :-(((((
      Direkt die ersten 2 Zeile werden rot markiert "UPDATE t" und "SET t.von = t14.von". Kannst du dir meinen Befehl nochmal bitte anschauen. Vielleicht übersehe ich ja was

      UPDATE t
      SET t.von = t14.von
      t.bis = t14.bis
      FROM [Jahresuebersicht] t
      JOIN [Jahresuebersicht] t14
      ON t14.land = t.land
      AND Gegenstand= Gegenstand
      WHERE t14.jahr = 2014
      AND t.jahr = 2015
      AND t.von IS NULL
      AND t.bis IS NULL;

      Vielen Dank für deine Unterstützung !!!

      Comment


      • #4
        Originally posted by melih79 View Post
        Hallo Defo,

        wir arbeiten hier mit dem MS SQL Server 2008 und der Befehl funktioniert leider nicht ( Management Studio) :-(((((
        Direkt die ersten 2 Zeile werden rot markiert "UPDATE t" und "SET t.von = t14.von". Kannst du dir meinen Befehl nochmal bitte anschauen. Vielleicht übersehe ich ja was
        Ja, Du übersiehst offenbar die Fehlermeldung, "rot" ist keine Fehlermeldung. Vielleicht bist Du so nett und postest die Fehlermeldung auch.
        Ich habe hier kein MSSQL geschweige Version 2008 und ich bin kein Interpreter. Und dann habe ich nicht Deine Tabelle, Daten und Feldnamen, also wem hilft das in der Form?
        Ach und apropos "übersehen", wieso quält Ihr Euch und andere immer mit diesem unformatierten Code? Formatier es ordentlich und nutze die HIGHLIGHT Funktion, dann sieht man gleich viel besser.
        Gruß, defo

        Comment


        • #5
          Hallo Defo,

          die Fehlermeldung lautet wie folgt :

          Meldung 102, Ebene 15, Status 1, Zeile 3
          Incorrect syntax near 't'.

          Ich habe in meiner ersten Nachricht die Tabelle mit den Feldnamen genau benannt. Leider weiss ich nicht, was du mit HIGLIGHT Funktion meinst ?!

          Comment


          • #6
            ok, also zur Anwendung einer Fehlermeldung mal durchgespielt, was da steht und was wir sonst noch an Infos haben.
            die ersten 2 Zeilen sind rot, da sehe ich keinen Fehler
            der Fehler liegt laut Fehlermeldung in Zeile 3 bei Table Alias 't', sieht auch gut aus, aber: es fehlt ein Komma zwischen den beiden Feldern, die zu Updaten sind.
            Mir hilft bei sowas immer die Formatierung, wenn man farbliche Kennzeichnung hat, wenn die Anweisung sinnvoll eingerückt ist, kann man sowas viel leichter finden. Ausnahme: Mein eigener Beitrag, den ich ungeprüft gepostet habe. Den hast Du ungeprüft übernommen und das fehlende Komma auch nicht bemerkt. Die Fehlermeldung ist hier nicht sehr genau, aber letztlich doch meistens eine gute Spur.
            Was ich mit HIGHLIGHT meine findet man hier: https://entwickler-forum.de/showthre...Beitr%C3%A4gen und an hunderten anderen Stellen hier im Forum.

            Am Ende in der JOIN Clause fehlt noch ein Table Alias, hier sehr gefährlich, weil es das Update Volumen ungewollt vervielfachen kann:
            "Gegenstant=Gegenstand" ist eine nicht sehr sinnvolle Bedingung. Aber es würde glaube ich auch so nicht funktionieren, weil die Feldbezeichner bei 2 Tabellen nicht eindeutig sind.
            Gruß, defo

            Comment


            • #7
              Hallo Defo,

              1. Vielen Dank für deine Korrektur !!! Du hattest recht, es lag an dem Komma. Auch den fehlenden Alias habe ich wie folgt nachgetragen:

              [highlight=sql]
              UPDATE t
              SET t.von = t14.von,
              t.bis = t14.bis
              FROM [Jahresuebersicht] t
              JOIN [Jahresuebersicht] t14 ON t14.land = t.land
              AND t14.Gegenstand= t.Gegenstand
              WHERE t14.jahr = 2014
              AND t.jahr = 2015
              AND t.von IS NULL
              AND t.bis IS NULL;
              [/highlight]

              2. Jetzt weiss ich auch was du mit der HIGLICHT Funktion gemeint hast. Werde es in Zukunft berücksichtigen :-)
              Vielen Dank für deine Hilfe !!!

              DAAAAANNNNKEEEE!!!!

              Comment


              • #8
                Originally posted by melih79 View Post
                es lag an dem Komma.
                Gut! Dann noch mal zur Erinnerung: das Verfahren nennt sich

                korreliertes Update
                oder
                correlated Update

                und mit diesem Suchbegriff findest Du sehr viele Beispiel im Netz (auf Wunsch auch zur passenden Serverversion), die Du fast nur abtippen musst (mit Komma)
                Gruß, defo

                Comment

                Working...
                X