Algumas sugestões:
- Participe em
seasons
uma vez. Uma junção faz com que as linhas da tabela à esquerda sejam duplicadas, para que possam ser somadas duas vezes pelasum
agregar. Em caso de dúvida, execute a consulta semgroup by
para uma escola de exemplo. - Você teria que relacionar a subconsulta à consulta externa com algo como
inner_schools.id = outer_schools.id
- Mas até onde posso ver, você não precisa de uma subconsulta
Por exemplo:
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
Para várias categorias, você pode usar um 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