MySQL - Wert aus vorheriger Zeile übernehmen und einfügen

Max-Berater

Erfahrenes Mitglied
Klappt nun wie gewollt. Muss nur noch versuchen das NEW_Belegfeld_1 in die Tabelle zu schreiben und dann gegen das Belegfeld 1 zu ersetzen.
 

Zvoni

Erfahrenes Mitglied
Müsste doch ein simples
UPDATE Tabelle T1
SET T1.BELEGFELD_1= T2.NEW_BELEGFELD_1
FROM /* Hier die Abfrage mit der Lag funktion*/ AS T2
WHERE /*Hier die Bedingungen */ T1.ID=T2.ID
sein
nicht getestet.
musst natürlich die ID in der Abfrage mitliefern (oder was auch immer dein Primär Schlüssel ist)
 

Sempervivum

Erfahrenes Mitglied
Meine Kenntnisse reichen leider nicht aus, um den Verlauf dieser Diskussion und die Beispiele vollständig zu verstehen :) aber ich frage mich, ob es nicht einfacher geht. Meine Überlegung: Wie @Yaslaw eingangs schrieb, ist die Reihenfolge der Datensätze zunächst mal undefiniert und wird erst durch eine Sortierung hergestellt. Sehe ich mir die Beispiele an, die @Max-Berater gepostet hat, scheint mir, dass Belegfeld2 das einzige Kriterium ist, um zusammen gehörende Datensätze zu ermitteln. Sofern das zutrifft, kann man den fehlenden Wert in Belegfeld1 so auffüllen:
Code:
UPDATE buchungen as b1 set Belegfeld1=(
    SELECT DISTINCT Belegfeld1 FROM buchungen as b2
    WHERE b2.Belegfeld1 IS NOT NULL
        AND b1.Belegfeld2=b2.Belegfeld2
    )
Meine Testtabelle, der Einfachheit halber mit Nummern statt Strings:
Code:
--
-- Tabellenstruktur für Tabelle `buchungen`
--

CREATE TABLE `buchungen` (
  `id` int(11) NOT NULL,
  `Belegfeld1` int(11) DEFAULT NULL,
  `Belegfeld2` int(11) DEFAULT NULL,
  `Skonto` varchar(50) DEFAULT NULL,
  `Buchungstext` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `buchungen`
--

INSERT INTO `buchungen` (`id`, `Belegfeld1`, `Belegfeld2`, `Skonto`, `Buchungstext`) VALUES
(1, 100001, 194, 'Latlux', 100001),
(2, 100002, 195, 'Lotlux', 100002),
(3, 100003, 196, 'Lotlux', 100003),
(4, 100003, 196, 'Greenlam', 100003),
(5, 100002, 195, 'Fintone', 100002),
(6, 100000, 103, 'Bitwolf', 100000),
(7, 100001, 194, 'Ventosanzap', 100001),
(8, NULL, 195, 'Overhold', 999999),
(9, NULL, 196, 'Y-find', 999999),
(10, NULL, 194, 'Fintone', 999999);

buchungen.png
 
Zuletzt bearbeitet:

Max-Berater

Erfahrenes Mitglied
Ich muss leider erstmal kapitulieren. Habe versucht es nachzuvollziehen, aber ich glaube es fehlt mir einfach noch das Wissen hierzu das alles zu bewerkstelligen.
 

Zvoni

Erfahrenes Mitglied
Wie lautet dein Primärschlüssel für die Tabelle?
kann dir morgen glaube ich dann nen code zusammensetzen
 

Max-Berater

Erfahrenes Mitglied
SELECT IFNULL(CASE WHEN TRIM(t.`Belegfeld 1`)='' THEN NULL ELSE t.`Belegfeld 1` END,
LAG(t.`Belegfeld 1`, 1)
over (
-- Gruppieren über BELEGFELD_2
PARTITION BY t.`Beleginfo - Inhalt 4`
-- Absteigend sortiert BELEGFELD_1
ORDER BY t.`Belegfeld 1` DESC
)
) AS NEU_BELEGFELD_1,
t.*


FROM DATEV t;

Klappt so wie gewollt - Nur ich habe zu Beginn der Tabelle das Feld NEU_BELEGFELD_1. Dier Inhalt dieser Spalte NEU_BELEGFELD_1 müsste in die Spalte t.`Belegfeld 1` übernommen werden und NEU_BELEGFELD_1 wieder entfernt werden.

Mein Gedanke war nun die, nach dem Ausführen des Codes die angezeigte Ausgabe in einer Tabelle zb. DATEV_neu zu speichern und im Nachgang anhand Belegfeld 2 als Primärschlüssel der beiden Tabellen vorhanden ist die Abfrage zu gestalten. Leider finde ich keinen rechten Ansatz.

1645554166178.png

1645554194016.png