XavierJeukens
Gebruiker
- Lid geworden
- 7 jun 2007
- Berichten
- 22
Hallo allen,
mijn vraag gaat over de volgende twee tabellen (vereenvoudigd):
PROJECTEN (id, budget);
KOSTENPOSTEN(id, project_id, bedrag);
Ik wil graag een tabel weergeven met daarin:
- Alle projecten met hun id en hun budget
- Het totaal aan gemaakte kosten per project
Indien er van een project GEEN kosten bestaan, dus geen enkele corresponderende records in de tabel "kostenposten", dan wil ik: 0.
Ik heb de volgende (syntactisch juiste) query geschreven:
SELECT p.id, p.budget, CASE sum( k.bedrag ) WHEN NULL THEN 0 ELSE sum(k.bedrag) AS kostenTotaal
FROM projecten p
LEFT JOIN kostenposten k ON k.project_id = p.id
GROUP BY p.id
LIMIT 0 , 30;
Wat er gebeurt is dat mijn waarden voor het afgeleide veld "kostenTotaal" altijd NULL blijven, en niet worden omgezet naar 0 als ik dat zou willen. Voer ik een CASE uit met een specifieke waarde, zoals CASE sum( k.bedrag ) WHEN 6100 THEN 'JA' ELSE 'NEE' dan worden alle NULLS omgezet naar 'NEE' en 6100 netjes naar 'JA'. M.a.w.: het CASE-statement laat zich alleen niet uitvoeren op NULLS, wel op specifieke waarden. Een foutmelding blijft echter altijd uit.
Strict gezien is de waarde ook niet NULL denk ik, maar gewoon: ontbrekend. Er bestaan geen kostenposten-records bij sommige projecten, i.p.v. dat er een veld is met de waarde NULL. Tóch werk ik met een gejoinde tabel waarin NULLS voorkomen, en daar zou je dus mee moeten kunnen werken.
Weet iemand hoe ik dit toch kan oplossen?
Wat ik al geprobeerd heb:
- Ik heb al geprobeerd om het CASE statement te gebruiken in combi met "+ 10 - 10" of "* 1", maar dat sorteert geen enkel effect (ook geen fout)
- Ik heb geprobeerd een CASE te maken waarin ik zeg: WHEN sum( k.bedrag ) > 0 THEN sum ( k.bedrag ) ELSE 0 maar dat leidde wel tot een foutmelding.
Ook is er niet te rekenen met het berekende totaal, een actie als "rest = budget - kostenTotaal" geeft dan eveneens in alle gevallen NULL terug.
Wie weet raad met dit probleem? Volgens mij is het iets heel kleins, maar ik kom er niet uit....
Met vriendelijke groet,
Xavier
mijn vraag gaat over de volgende twee tabellen (vereenvoudigd):
PROJECTEN (id, budget);
KOSTENPOSTEN(id, project_id, bedrag);
Ik wil graag een tabel weergeven met daarin:
- Alle projecten met hun id en hun budget
- Het totaal aan gemaakte kosten per project
Indien er van een project GEEN kosten bestaan, dus geen enkele corresponderende records in de tabel "kostenposten", dan wil ik: 0.
Ik heb de volgende (syntactisch juiste) query geschreven:
SELECT p.id, p.budget, CASE sum( k.bedrag ) WHEN NULL THEN 0 ELSE sum(k.bedrag) AS kostenTotaal
FROM projecten p
LEFT JOIN kostenposten k ON k.project_id = p.id
GROUP BY p.id
LIMIT 0 , 30;
Wat er gebeurt is dat mijn waarden voor het afgeleide veld "kostenTotaal" altijd NULL blijven, en niet worden omgezet naar 0 als ik dat zou willen. Voer ik een CASE uit met een specifieke waarde, zoals CASE sum( k.bedrag ) WHEN 6100 THEN 'JA' ELSE 'NEE' dan worden alle NULLS omgezet naar 'NEE' en 6100 netjes naar 'JA'. M.a.w.: het CASE-statement laat zich alleen niet uitvoeren op NULLS, wel op specifieke waarden. Een foutmelding blijft echter altijd uit.
Strict gezien is de waarde ook niet NULL denk ik, maar gewoon: ontbrekend. Er bestaan geen kostenposten-records bij sommige projecten, i.p.v. dat er een veld is met de waarde NULL. Tóch werk ik met een gejoinde tabel waarin NULLS voorkomen, en daar zou je dus mee moeten kunnen werken.
Weet iemand hoe ik dit toch kan oplossen?
Wat ik al geprobeerd heb:
- Ik heb al geprobeerd om het CASE statement te gebruiken in combi met "+ 10 - 10" of "* 1", maar dat sorteert geen enkel effect (ook geen fout)
- Ik heb geprobeerd een CASE te maken waarin ik zeg: WHEN sum( k.bedrag ) > 0 THEN sum ( k.bedrag ) ELSE 0 maar dat leidde wel tot een foutmelding.
Ook is er niet te rekenen met het berekende totaal, een actie als "rest = budget - kostenTotaal" geeft dan eveneens in alle gevallen NULL terug.
Wie weet raad met dit probleem? Volgens mij is het iets heel kleins, maar ik kom er niet uit....
Met vriendelijke groet,
Xavier