SQL Update: Berechnen aus 2 Zeilen!
Hallo!
Habe ein Problem wo ich keine Lösung finde. Kann man ein Script erstellen wo folgende Brechnung ausgeführt wird un d als Update in der Datenbank gespeichert wird?
Folgenden Aufbau Besitzt die Datenbank:
ID DateTime wh.pos WH_ver
1 2014-02-17 00:00:01 1250 NULL
2 2014-02-17 01:00:10 1300 NULL
3 2014-02-17 02:00:06 1750 NULL
Nun möchte ich ein Script ausführen, das den Leistungsverbracuh brechnet und als Update in DB einfügt. Alle Tests sind derzeit Fehlgeschlagen. Vileicht habt ihr einen Lösungsansatz?
Folgende Test ist auch fehlgeschlagen, funktioniert zwar als Select aber nicht als Update.
SELECT SET `WH_ver` =
a.wh_pos-(
select max(wh_pos) from dieseldaten_stunden where wh_pos < a.wh_pos) as Differenz_WH
Vielen Dank
Mfg
Michael
Habe ein Problem wo ich keine Lösung finde. Kann man ein Script erstellen wo folgende Brechnung ausgeführt wird un d als Update in der Datenbank gespeichert wird?
Folgenden Aufbau Besitzt die Datenbank:
ID DateTime wh.pos WH_ver
1 2014-02-17 00:00:01 1250 NULL
2 2014-02-17 01:00:10 1300 NULL
3 2014-02-17 02:00:06 1750 NULL
Nun möchte ich ein Script ausführen, das den Leistungsverbracuh brechnet und als Update in DB einfügt. Alle Tests sind derzeit Fehlgeschlagen. Vileicht habt ihr einen Lösungsansatz?
Folgende Test ist auch fehlgeschlagen, funktioniert zwar als Select aber nicht als Update.
SELECT SET `WH_ver` =
a.wh_pos-(
select max(wh_pos) from dieseldaten_stunden where wh_pos < a.wh_pos) as Differenz_WH
Vielen Dank
Mfg
Michael
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 230147
Url: https://administrator.de/contentid/230147
Ausgedruckt am: 25.11.2024 um 15:11 Uhr
1 Kommentar
Moin Much2k,
es geht ja, wenn ich das verstümmelte Statement richtig deute, nur um EINE Tabelle namens dieseldaten_stunden.
Wenn ja, dann muss das SELECT-Statement so (oder ähnlich) lauten.
Aber bevor du das als UPDATE.Statement umschreibst, muss es erstmal sauber funktionieren - und das macht es IMHO nicht.
Denn in den Fällen, in denen im Inline-Select " ..Max(wh_pos) WHERE wh_pos < a.wh_pos) " gar keine kleinere wh_pos gefunden wird, also z.B. bei der ID 1, --> wir die Formel aufgelöst zu ergibt das errechnete Feld "wh_pos - (NULL)".
Okay, ein numerischer Wert minus NULL ergibt bei (fast) allen DBMSen keinen Fehler, sondern wieder NULL... aber
a) ist das nur ein Entgegenkommen des Datenbank-Designers, nichts Einklagbares
b) warum solltest du ein Feld mit dem jetzigen Inhalt NULL mit dem Wert NULL updaten wollen? Weil du es kannst...?
Wenn du das alles billigend in Kauf nimmst, dann wäre das Updatestatement (das ALLE Datensätze unabhängig von einer Notwendigkeit) updated:
Wenn du im oben beschriebenen "überschreibe NULL mit NULL"-Fall eher einen Wert 0 statt NULL schreiben willst:
-> dann musst du das Inline-Select mit NVL( (select max()... from bla), 0) aufhybschen
[Edit:NVL( prüfwert, FallsNULLErsatzwert) heisst es bei Oracle, bei dir ist es vermutlich mySQL-
-> dann stattdessen IfNull( prüfwert, FallsNULLErsatzwert) .// mySQL-Äquivalent
Oder auch Coalesce( prüfwert, FallsNULLErsatzwert) , das können (fast) alle, also mindestens Oracle, DB2, mySQL. [/Edit]
Wenn du die Ersetze-NULL-durch-NULL-Werte gar nicht erst schreiben willst
-> dann musst du eine entsprechende WHERE-Clause anfügen.
Grüße
Biber
es geht ja, wenn ich das verstümmelte Statement richtig deute, nur um EINE Tabelle namens dieseldaten_stunden.
Wenn ja, dann muss das SELECT-Statement so (oder ähnlich) lauten.
SELECT a.id, a.DateTime, a.wh_pos
a.wh_pos-(
select max(wh_pos) from dieseldaten_stunden where wh_pos < a.wh_pos)
as Differenz_WH
from dieseldaten_stunden
Aber bevor du das als UPDATE.Statement umschreibst, muss es erstmal sauber funktionieren - und das macht es IMHO nicht.
Denn in den Fällen, in denen im Inline-Select " ..Max(wh_pos) WHERE wh_pos < a.wh_pos) " gar keine kleinere wh_pos gefunden wird, also z.B. bei der ID 1, --> wir die Formel aufgelöst zu ergibt das errechnete Feld "wh_pos - (NULL)".
Okay, ein numerischer Wert minus NULL ergibt bei (fast) allen DBMSen keinen Fehler, sondern wieder NULL... aber
a) ist das nur ein Entgegenkommen des Datenbank-Designers, nichts Einklagbares
b) warum solltest du ein Feld mit dem jetzigen Inhalt NULL mit dem Wert NULL updaten wollen? Weil du es kannst...?
Wenn du das alles billigend in Kauf nimmst, dann wäre das Updatestatement (das ALLE Datensätze unabhängig von einer Notwendigkeit) updated:
UPDATE dieseldaten_stunden a
SET WH_ver =
a.wh_pos-(
select max(wh_pos) from dieseldaten_stunden
where wh_pos < a.wh_pos)
;
Wenn du im oben beschriebenen "überschreibe NULL mit NULL"-Fall eher einen Wert 0 statt NULL schreiben willst:
-> dann musst du das Inline-Select mit NVL( (select max()... from bla), 0) aufhybschen
[Edit:NVL( prüfwert, FallsNULLErsatzwert) heisst es bei Oracle, bei dir ist es vermutlich mySQL-
-> dann stattdessen IfNull( prüfwert, FallsNULLErsatzwert) .// mySQL-Äquivalent
Oder auch Coalesce( prüfwert, FallsNULLErsatzwert) , das können (fast) alle, also mindestens Oracle, DB2, mySQL. [/Edit]
Wenn du die Ersetze-NULL-durch-NULL-Werte gar nicht erst schreiben willst
-> dann musst du eine entsprechende WHERE-Clause anfügen.
Grüße
Biber