Quelques suggestions :
- Rejoindre les
seasons
une fois. Une jointure provoque la duplication des lignes de la table de gauche, de sorte qu'elles peuvent être additionnées deux fois par lasum
agrégat. En cas de doute, exécutez la requête sansgroup by
pour un exemple d'école. - Vous devez associer la sous-requête à la requête externe avec quelque chose comme
inner_schools.id = outer_schools.id
- Mais pour autant que je sache, vous n'avez pas du tout besoin d'une sous-requête
Par exemple :
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
Pour plusieurs catégories, vous pouvez utiliser un cas :
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