# Mit NULL rechnen (MySQL 4.1)



## Mamphil (16. September 2006)

Hallo!

Ich habe zwei Tabellen (hier vereinfacht dargestellt):
Tabelle Bestellungen enthält die Felder BestId (INT), Gesamtpreis (DECIMAL),
Tabelle Buchungen enthält die Felder BuchungsId (INT), BestId (INT), Buchung (DECIMAL)

Eigentlich kann ich so alle Bestellungen raussuchen und den noch offenen Betrag ermitteln:

```
SELECT be.BestId, be.Gesamtpreis, be.Gesamtpreis - SUM(bu.Buchung) AS BetragOffen
FROM Bestellungen AS be
LEFT JOIN Buchungen AS bu
ON bu.BestId = be.BestId
GROUP BY be.BestId
```
Das ganze funktioniert auch in MySQL 3.x; jetzt bin ich aber auf einem Server mit MySQL 4.1 und habe folgendes Problem:
Wenn noch keine Buchungen vorhanden sind, ergibt SUM(bu.Buchung) NULL. In MySQL war [Betrag] - NULL = [Betrag], in MySQL ist aber leider [Betrag] - NULL = NULL.

Habt ihr eine Idee, wie ich die NULL in eine 0 (Null) umwandeln kann?

Vielen Dank für eure Vorschläge,
 Mamphil


----------



## Gumbo (16. September 2006)

Dann passe die Abfrage einfach daran an:
	
	
	



```
SELECT be.BestId, be.Gesamtpreis, IF(be.Gesamtpreis IS NULL, 0, be.Gesamtpreis) - SUM(bu.Buchung) AS BetragOffen
FROM Bestellungen AS be
LEFT JOIN Buchungen AS bu
ON bu.BestId = be.BestId
GROUP BY be.BestId
```


----------



## Mamphil (16. September 2006)

Super, vielen Dank für die schnelle Hilfe! An "IF" hatte ich gar nicht gedacht, ich wollte das irgendwie umwandeln...
Allerdings sieht mein Query so aus:
	
	
	



```
SELECT be.BestId, be.Gesamtpreis, be.Gesamtpreis  - IF(SUM(bu.Buchung) IS NULL, 0, SUM(bu.Buchung)) AS BetragOffen
FROM Bestellungen AS be
LEFT JOIN Buchungen AS bu
ON bu.BestId = be.BestId
GROUP BY be.BestId
```
Das Problem war schließlich, dass bei der Summe NULL rauskam 

Danke nochmals,
 Mamphil


----------



## Matthias Reitinger (16. September 2006)

Hallo,

schöner geht's mit COALESCE:

```
SELECT be.BestId, be.Gesamtpreis, be.Gesamtpreis  - COALESCE(SUM(bu.Buchung), 0) AS BetragOffen
…
```
Der COALESCE-Operator gibt immer den ersten Wert seiner Parameterliste zurück, der nicht NULL ist (oder NULL, wenn es einen solchen nicht gibt).

Grüße,
 Matthias


----------

