Door
- Roland -
op 09-05-2013 14:09
gewijzigd op 09-05-2013 14:13
1.483 views
SELECT a.id, a.max, , d.act_id ,
sum(d.aantal) as tot, max - sum(d.aantal) as Over
FROM activiteiten as a
LEFT JOIN act_deelnemers as d
ON a.id=d.act_id
GROUP BY a.id
Elke activiteit heeft een max(imum) aantal inschrijvingen. Ik wil graag het aantal open plekken weten.
Als er inschrijvingen zijn voor de activiteit krijg ik netjes het aantal: Over
Maar ik krijg bij activiteiten waar nog geen inschrijvingen zijn (tot => NULL) ook voor Max de waarde NULL
Is wel met php op te lossen, maar kan dit ook met sql ?
Nb. ander vraagje: ik vraag 2x hier naar sum(d.aantal) dat is overbodig werk maar als ik de 2e keer in plaats daarvan tot invul snapt hij dat niet ! ?
SELECT a.id, a.max, d.act_id ,
COALESCE(sum(d.aantal), 0) as tot, max-COALESCE(sum(d.aantal),0) as Over
FROM activiteiten as a
LEFT JOIN act_deelnemers as d
ON a.id=d.act_id
GROUP BY a.id
Wellicht ook zo, maar dat moet je even testen:
SELECT a.id, a.max, d.act_id ,
COALESCE(sum(d.aantal), 0) as tot, max-tot as Over
FROM activiteiten as a
LEFT JOIN act_deelnemers as d
ON a.id=d.act_id
GROUP BY a.id
Verder behoor je je GROUP BY over alle niet aggregate kolommen te doen, dus niet alleen over a.id.
In dit geval wil je dit omdat als er nog geen records in je gejoinde tabel zitten, dan krijg je NULL terug en alleen in dat geval wil je 0 en niet NULL.
Met IF kan het ook, COALESCE is vooral makkelijker als je drie of meer waardes wilt checken.
Wat je kan doen om die dubbele telling te vermijden is de telling in een subquery uit te voeren:
SELECT a.id, a.max, d.act_id ,
COALESCE(totaal, 0) as tot, max-COALESCE(totaal,0) as Over
FROM activiteiten as a
LEFT JOIN (
SELECT SUM(aantal) AS totaal, act_id
FROM act_deelnemers
GROUP BY act_id
) d ON a.id=d.act_id
Edit: laatste GROUP BY weggehaald, want die is dan niet meer nodig.