Zum Inhalt springen

Berechnung in SELECT ergibt Nullwert


tribestar

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...