Alcuni suggerimenti:
- Unisciti a
seasons
una volta. Un join fa sì che le righe della tabella di sinistra vengano duplicate, quindi possono essere sommate due volte dalsum
aggregato. In caso di dubbio, esegui la query senzagroup by
per una scuola di esempio. - Dovresti mettere in relazione la sottoquery con la query esterna con qualcosa come
inner_schools.id = outer_schools.id
- Ma per quanto posso vedere, non hai affatto bisogno di una sottoquery
Ad esempio:
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
Per più categorie, puoi utilizzare un caso:
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