Tabellenergebnisse mit into in neue tabelle schreiben, aber leere ergebnisse mit 0 auffüllen
Moin zusammen, nach der echt tollen Hilfe bei meinen ersten beitrag war ich sehr begeistert und traue mich gleich mal eine 2. Frage zu stellen, die so ein bisschen als folge der ersten lösung nun auftritt... freue mich, wenn Ihr mir nen tipp geben könnt.
ich schiebe hier ergebnisse in eine neu tabelle temp_DB_name
SELECT
a.id as Art_Id,
a.EAN ,
a.Artikel_Nr ,
a.Artikel_Bezeichnung,
a.Bestand as Soll_Menge,
i.Menge as gezählt_Menge,
(a.Bestand - i.Menge ) as Differenz
into " & temp_DB_name & " FROM
Artikel a left JOIN (SELECT Inventur.ean, Sum( Inventur.menge ) as Menge from Inventur group by ean) i on i.ean = a.ean where a.id > 0 " & LAGERARTIKEL_Kurz & POSARTIKEL_Kurz & " and ( i.ean is null or a.Bestand <> i.Menge )
(sorry, dass das hier nicht so schön in der vorschau aussieht)
mein problem sind diese beiden Felder, wenn sie in die neue tabelle geschrieben werden:
i.Menge as gezählt_Menge,
(a.Bestand - i.Menge ) as Differenz
Wenn i.Menge nicht vorhanden ist, da feld leer, soll beim schreiben mit der into anweisung in die neue tabelle wenigstens eine 0 reingeschreiben werden (und nicht nix NULL)
Problem 2: wenn i.Menge bei der abfrage nix beinhalten ist bei (a.Bestand - i.Menge ) as Differenz leider immer auch das Ergebnis NULL (wenn a.Bestand aber z.b. 30 wäre, und i.Menge 0 (oder NULL), soll Differenz aber eben auch 30 sein. Durch NULL im feld i.Menge kommt die Rechenoperation aber leider durcheinander.
ich kann zwar nach erstellen der neuen tabelle alle leeren felder mit 0 auffüllen, indem ich ein update temp_DB_name set gezählt Menge= 0 where gezählt_Menge is Null ausführe, aber ist nicht die feine art, und ausserdem löse ich das problem mit dem automatisch zu errechnenden feld differenz beim schreiben der neuen tabelle auch nicht sauber.
Es gibt ja solche DEFAULT Anweisung beim erstellen eines feldes, aber wie das bei dieser tabellen erstellung on thy fly klappt, weiss ich nicht
ich schiebe hier ergebnisse in eine neu tabelle temp_DB_name
SELECT
a.id as Art_Id,
a.EAN ,
a.Artikel_Nr ,
a.Artikel_Bezeichnung,
a.Bestand as Soll_Menge,
i.Menge as gezählt_Menge,
(a.Bestand - i.Menge ) as Differenz
into " & temp_DB_name & " FROM
Artikel a left JOIN (SELECT Inventur.ean, Sum( Inventur.menge ) as Menge from Inventur group by ean) i on i.ean = a.ean where a.id > 0 " & LAGERARTIKEL_Kurz & POSARTIKEL_Kurz & " and ( i.ean is null or a.Bestand <> i.Menge )
(sorry, dass das hier nicht so schön in der vorschau aussieht)
mein problem sind diese beiden Felder, wenn sie in die neue tabelle geschrieben werden:
i.Menge as gezählt_Menge,
(a.Bestand - i.Menge ) as Differenz
Wenn i.Menge nicht vorhanden ist, da feld leer, soll beim schreiben mit der into anweisung in die neue tabelle wenigstens eine 0 reingeschreiben werden (und nicht nix NULL)
Problem 2: wenn i.Menge bei der abfrage nix beinhalten ist bei (a.Bestand - i.Menge ) as Differenz leider immer auch das Ergebnis NULL (wenn a.Bestand aber z.b. 30 wäre, und i.Menge 0 (oder NULL), soll Differenz aber eben auch 30 sein. Durch NULL im feld i.Menge kommt die Rechenoperation aber leider durcheinander.
ich kann zwar nach erstellen der neuen tabelle alle leeren felder mit 0 auffüllen, indem ich ein update temp_DB_name set gezählt Menge= 0 where gezählt_Menge is Null ausführe, aber ist nicht die feine art, und ausserdem löse ich das problem mit dem automatisch zu errechnenden feld differenz beim schreiben der neuen tabelle auch nicht sauber.
Es gibt ja solche DEFAULT Anweisung beim erstellen eines feldes, aber wie das bei dieser tabellen erstellung on thy fly klappt, weiss ich nicht
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 178052
Url: https://administrator.de/contentid/178052
Ausgedruckt am: 22.11.2024 um 21:11 Uhr
9 Kommentare
Neuester Kommentar
Hi,
je nach SQL Variante kannst du folgendes im Select benutzen:
isnull(i.Menge,0) as gezählt_Menge,
isnull((a.Bestand - i.Menge ),a.Bestand) as Differenz
ifnull(i.Menge,0) as gezählt_Menge,
ifnull((a.Bestand - i.Menge ),a.Bestand) as Differenz
Das ersetzt dann NULL-Werte mit vorgegebenen Werten, diese können sowohl Text als auch Zahlen sein.
Gruß
je nach SQL Variante kannst du folgendes im Select benutzen:
isnull(i.Menge,0) as gezählt_Menge,
isnull((a.Bestand - i.Menge ),a.Bestand) as Differenz
ifnull(i.Menge,0) as gezählt_Menge,
ifnull((a.Bestand - i.Menge ),a.Bestand) as Differenz
Das ersetzt dann NULL-Werte mit vorgegebenen Werten, diese können sowohl Text als auch Zahlen sein.
Gruß
Achso Access, ich bin von einer richtigen Datenbank ausgegangen. ;)
Versuch mal das:
http://www.techonthenet.com/access/functions/advanced/isnull.php
Gruß
Versuch mal das:
http://www.techonthenet.com/access/functions/advanced/isnull.php
Gruß
Moin boesi666,
nur als Ergänzung zu Indrador.
-> die Änderung in deinem Statement sollte hinauslaufen auf ein
Bitte verwende auch du in Zukunft die Codeformatierung und vor allem gib das verwendete Datenbanksystem an.
Denn es gibt entscheidende Syntaxunterschiede- wie du selbst hier erlebt hast - zwischen dem SQL von mySQL, Access, Oracle oder MSSQL.
Grüße
Biber
nur als Ergänzung zu Indrador.
-> die Änderung in deinem Statement sollte hinauslaufen auf ein
SELECT ...
.. INTO....
FROM
Artikel a left JOIN (SELECT Inventur.ean,
IIF(IsNull(Sum( Inventur.menge )), 0, Sum( Inventur.menge )) as Menge
from Inventur ....
Bitte verwende auch du in Zukunft die Codeformatierung und vor allem gib das verwendete Datenbanksystem an.
Denn es gibt entscheidende Syntaxunterschiede- wie du selbst hier erlebt hast - zwischen dem SQL von mySQL, Access, Oracle oder MSSQL.
Grüße
Biber
Moin boesi666,
Ich sach ma' so....
Eine schnell skizzierte Access-Desktop-Datenbank als proof-of-concept für das Design einer "echten" Datenbank...
-> das geht in Ordnung.
Aber es sollte und darf nicht angestrebt werden, die vollständige Funktionalität nachbilden zu wollen.
Access war schon immer ein ungeliebtes Redmonder Stiefkind, und der Implementierungsumfang des JET-SQL hatte immer nur Demo-Charakter. Gedacht dafür, Heimanwendern die Angst vor Datenbanken zu nehmen oder auch um Appetit auf eine "echte" Datenbank zu machen.
Steck also in diese Access-Entwicklung nicht zuviel Aufwand rein.
Denn so viele Verrenkungen brauchst du später unter mySQL gar nicht machen.
Auch dieses ganze Gewurschtele mit
Die Frage nach der Codeformatierung hast du dir eigentlich eindrucksvoll selbst beantwortet.
Wenn dann für diesen Beitrag keine weiteren Fragen offen sind, dann...
-> Haken dran
und Frohes Fest
Biber
wobei .... in der regel zwischen dieser mysql DB und der access db ... fast immer identische arbeitsweisen habe
Ich sach ma' so....
Eine schnell skizzierte Access-Desktop-Datenbank als proof-of-concept für das Design einer "echten" Datenbank...
-> das geht in Ordnung.
Aber es sollte und darf nicht angestrebt werden, die vollständige Funktionalität nachbilden zu wollen.
Access war schon immer ein ungeliebtes Redmonder Stiefkind, und der Implementierungsumfang des JET-SQL hatte immer nur Demo-Charakter. Gedacht dafür, Heimanwendern die Angst vor Datenbanken zu nehmen oder auch um Appetit auf eine "echte" Datenbank zu machen.
Steck also in diese Access-Entwicklung nicht zuviel Aufwand rein.
Denn so viele Verrenkungen brauchst du später unter mySQL gar nicht machen.
Auch dieses ganze Gewurschtele mit
"IIF(Isnull(bla), dann 0, sonst bla)"
..reduziert sich unter mySQL wieder auf ein simples"COALESCE(bla, 0)"
Die Frage nach der Codeformatierung hast du dir eigentlich eindrucksvoll selbst beantwortet.
Wenn dann für diesen Beitrag keine weiteren Fragen offen sind, dann...
-> Haken dran
und Frohes Fest
Biber