Enkele suggesties:
- Doe mee met
seasons
eenmaal. Een join zorgt ervoor dat rijen uit de linkertabel worden gedupliceerd, zodat ze twee keer kunnen worden opgeteld met desum
totaal. Voer bij twijfel de query uit zondergroup by
voor een voorbeeldschool. - Je zou de subquery moeten relateren aan de buitenste query met iets als
inner_schools.id = outer_schools.id
- Maar voor zover ik kan zien, heb je helemaal geen subquery nodig
Bijvoorbeeld:
SELECT schools.*
, sum(cashflows.amount) total_branding_cashflow
FROM schools
JOIN seasons
ON seasons.school_id = schools.id
and seasons.year = 2010
JOIN cashflows
ON cashflows.season_id = seasons.id
and cashflow_group_id = 12
GROUP BY
schools.id
HAVING total_branding_cashflow BETWEEN 50000000 AND 100000000
Voor meerdere categorieën kunt u een case gebruiken:
SELECT schools.*
, sum(case when cashflow_group_id = 1 then cashflows.amount end) total1
, sum(case when cashflow_group_id = 12 then cashflows.amount end) total12
FROM schools
JOIN seasons
ON seasons.school_id = schools.id
and seasons.year = 2010
JOIN cashflows
ON cashflows.season_id = seasons.id
GROUP BY
schools.id