tribestar Geschrieben 12. Oktober 2005 Teilen Geschrieben 12. Oktober 2005 Hi, ich habe ein SELECT-Statement was mir die Differenz zwischen einem Wert und der Summe vieler Einzelwerte errechnet. Sobald aber keine Einzelwerte vorliegen wird von meinem Einzelwert nicht die Zahl 0 (null) abgezogen, sondern das Ergebnis der gesamten Rechnung nimmt den NULL-Wert an, d.h. das Ergebnisfeld bleibt leer. Mein SQL-Statement sieht wie folgt aus: SELECT TabelleA.FeldA - SUM(TabelleB.FeldB) FROM TabelleA, TabelleB WHERE TabelleA.Schluessel = 'Wert' AND TabelleB.Schluessel = 'Wert' AND TabelleB.Bedingung = 1 TabelleA steht in einer 1:n Beziehung zu TabelleB. Wenn es keinen Datensatz in TabelleB gibt, auf den die Bedingungen zutreffen bekomme ich den besagten Null-Wert als Ergebnis. Ich möchte in diesem Fall aber TabelleA.FeldA - 0 als Ergebnis haben, wie bekomme ich das hin ? gruß, tribe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 12. Oktober 2005 Teilen Geschrieben 12. Oktober 2005 vielleicht so : SELECT TabelleA.FeldA - SUM(TabelleB.FeldB) + 0 FROM TabelleA, TabelleB WHERE TabelleA.Schluessel = 'Wert' AND TabelleB.Schluessel = 'Wert' AND TabelleB.Bedingung = 1 [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tribestar Geschrieben 12. Oktober 2005 Autor Teilen Geschrieben 12. Oktober 2005 Leider nicht, das Problem scheint zu sein das sobald das Ergebnis der SUM() Funktion den Wert NULL annimmt wird das Ergebnis des gesamten Statements NULL. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 12. Oktober 2005 Teilen Geschrieben 12. Oktober 2005 Probier mal das (nicht getestet sondern aus dem Kopf): SELECT TabelleA.FeldA - CASE (SUM(TabelleB.FeldB) IF NULL THEN 0 ELSE SUM(TabelleB.FeldB)) END FROM TabelleA, TabelleB WHERE TabelleA.Schluessel = 'Wert' AND TabelleB.Schluessel = 'Wert' AND TabelleB.Bedingung = 1 EDIT: Ach ja... WHERE TabelleA.Schluessel = TabelleB.Schluessel ist für die Verknüpfung eleganter (finde ich) für die Festlegung eines Wertes kannst du ja noch ein ... AND TabelleB.Schluessel = "Wert" hintendranhängen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tribestar Geschrieben 12. Oktober 2005 Autor Teilen Geschrieben 12. Oktober 2005 Mit der Eleganz kann ich dir recht geben, jedoch scheint MySQL die IF NULL Abfrage nicht zu schmecken, ich kriege You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NULL THEN 0 ELSE SUM(TabelleB.FeldB)) END als Ergebnis. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tribestar Geschrieben 12. Oktober 2005 Autor Teilen Geschrieben 12. Oktober 2005 Aber du hast mich auf eine neue Idee und damit auch auf neue Probleme gestossen Ich habe jetzt eine IF-Abzweigung eingebaut, die auch (teilweise) zu funktionieren scheint: SELECT IF ( #IF SUM(TabelleB.FeldB)>0, #THEN TabelleA.FeldA - SUM(TabelleB.FeldB), #ELSE TabelleA.FeldA ) FROM TabelleA, TabelleB WHERE TabelleA.Schluessel = TabelleB.Schluessel AND TabelleB.Schluessel = 'Wert' AND TabelleB.Bedingung = 1 Leider funktioniert diese Methode nur in soweit, das ein konstanter ELSE-Wert als Ergebnis rauskommen würde, wenn ich z.B. das hier schreibe: SELECT IF ( #IF SUM(TabelleB.FeldB)>0, #THEN TabelleA.FeldA - SUM(TabelleB.FeldB), #ELSE 1 ) [...] kommt auch wirklich 1 raus, wenn der IF-Teil nicht erfüllt wird. Wenn ich allerdings den Bezug zu TabelleA.FeldA drin lasse, kommt wiederrum auch hier nur ein NULL-Wert raus. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 12. Oktober 2005 Teilen Geschrieben 12. Oktober 2005 SELECT TabelleA.FeldA - (CASE (SUM(TabelleB.FeldB) WHEN NULL THEN 0 ELSE SUM(TabelleB.FeldB)) END CASE) FROM TabelleA, TabelleB WHERE TabelleA.Schluessel = 'Wert' AND TabelleB.Schluessel = 'Wert' AND TabelleB.Bedingung = 1 vielleicht so ? versuch einmal mit fetten klammern und mal ohne Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 12. Oktober 2005 Teilen Geschrieben 12. Oktober 2005 SELECT TabelleA.FeldA - (CASE (SUM(TabelleB.FeldB) WHEN NULL ... auf jeden Fall muss da ein WHEN hin, IF is da verkehrt vielleicht anstelle von NULL auch ISNULL oder IS NULL (kann das jetzt nich testen). Schau dir dazu doch die MySQL Doku an: http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html hm, irgendwie ham die da wohl zur Zeit Probs... es gab auch mal ne deutsche Anleitung (wobei die englische detailierter is IMHO), im Moment findet er die aber nich. EDIT: IFNULL(expr1,expr2) (siehe Doku) solltest du auch ma probieren... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tribestar Geschrieben 13. Oktober 2005 Autor Teilen Geschrieben 13. Oktober 2005 @baba007: Mit oder ohne Klammer hängt sich MySQL immer an der WHEN-Bedingung auf, ob ich nun ISNULL, IS NULL oder NULL verwende.. @JesterDay: mit IFNULL bin ich gerade am fuhrwerken, aber es will noch nicht so richtig. Mein Code sieht jetzt so aus: SELECT IFNULL((TabelleA.FeldA - (SUM(TabelleB.FeldB))),TabelleA.FeldA) FROM TabelleA, TabelleB WHERE TabelleA.Schluessel = TabelleB.Schluessel AND TabelleB.Schluessel = 'Wert' AND TabelleB.Bedingung = 1 kommt jedoch weiterhin NULL raus, was läuft da falsch? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 13. Oktober 2005 Teilen Geschrieben 13. Oktober 2005 kommt jedoch weiterhin NULL raus, was läuft da falsch? meinte das eher so: ... IFNULL(SUM(TabelleB.FeldB), SUM(TabelleB.FeldB), 0)... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tribestar Geschrieben 13. Oktober 2005 Autor Teilen Geschrieben 13. Oktober 2005 So langsam nährere ich mich der Lösung, aber die Probleme die dieser Weg mit sich bringt sind auch nicht gerade leichter geworden. Ich glaube zu wissen warum die IFNULL-Abfrage nicht zu funktionieren scheint, wenn es keine Datensätze in TabelleB gibt, die die WHERE-Klausel "TabelleB.Bedingung = 1" erfüllen gibt es ja auch keinen Datensatz aus TabelleA. Damit wäre mein Alternativwert auch immer NULL. Wie kann ich dann in dem 2. Ausdruck der IFNULL(Ausdruck1, Ausdruck2) Funktion eine neue SELECT-Abfrage durchführen oder gibt es andere Wege dieses Problem zu lösen? @JesterDay: Das Problem ist das ich für TabelleA.FeldA auch immer NULL rauskriege wenn TabelleB.FeldB den Wert NULL annimmt. Nur leider kann ich das nicht durch '0' ersetzen, da dieser Wert variabel ist und aus der Datenbank ausgelesen werd muss. Dafür müsste meine Select-Abfrage aber anders aussehen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 13. Oktober 2005 Teilen Geschrieben 13. Oktober 2005 wenn es keine Datensätze in TabelleB gibt, die die WHERE-Klausel "TabelleB.Bedingung = 1" erfüllen gibt es ja auch keinen Datensatz aus TabelleA. Du musst die Tabellen mit einem Left outer join verknüpfen: select TabelleA.FeldA - IFNULL(SUM(TabelleB.FeldB), SUM(TabelleB.FeldB), 0) FROM TabelleA LEFT OUTER JOIN TabelleB ON TabelleA.Schluessel = TabelleB.Schluessel WHERE TabelleA.Schlüssel = 'Wert' AND TabelleB.Bedingung = 1 Für alle Felder, die in Tabelle A keine Entsprechung in Tabelle B haben, liefert er dann die Felder aus A zurück und dir Felder aus B haben in diesem Satz dann den Wert NULL. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tribestar Geschrieben 13. Oktober 2005 Autor Teilen Geschrieben 13. Oktober 2005 Hi, bei mir ergibt der LEFT OUTER JOIN die gleiche Ergebnismenge wie die Verknüpfung über die WHERE-Klausel, wie ich sie vorher hatte. Damit bleibt das Ergebnis der Berechnung weiterhin NULL... Welche Möglichkeiten habe ich noch, kann ich als Alternativwert irgendwie ein anderes SELECT-Statement einbringen und wenn ja wie? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tribestar Geschrieben 13. Oktober 2005 Autor Teilen Geschrieben 13. Oktober 2005 Ahh.. Hurray, ich habs ! Die Bedingung (TabelleB.Bedinung = 1) darf nicht in die WHERE-Klausel sondern muss als weitere Einschränkung mit in die JOIN-Bedingung ..., aber seht selbst: SELECT TabelleA.FeldA - IFNULL(SUM(TabelleB.FeldB),0) FROM TabelleA LEFT OUTER JOIN TabelleB ON TabelleA.Schluessel = TabelleB.Schluessel AND TabelleB.Bedingung = 1 WHERE TabelleA.Schluessel = 'Wert' Damit wird der Effekt erreicht, das auch wenn kein Datensatz der TabelleB die Bedingung erfüllt ein mit NULL-Werten gefüllter Satz als Ergebnis angezeigt wird. Dank dir nochmal für den Tip JesterDay, ohne den sähe ich ganz schön alt aus. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.