I have a script that is trying to collate some census data.
x
SELECT tbl.State, tbl.ranges, tbl.race, tbl.origin, tbl.sex
FROM (select case
when age between 18 and 23 then '18-23'
when age between 24 and 35 then '24-35'
else '36-85' end as ranges,
[State]
,race,
sex,
origin
from [StateSexOriginRaceAge]
group by State, age, pop, race, sex, origin
having sex > 0
) as tbl
group by tbl.State, tbl.ranges, tbl.race, tbl.sex, tbl.origin
order by state, ranges, race, origin, sex
The output is looking roughly like what i want, except there is a population column, and I want to sum the population column for each age bracket. Any thoughts?
I tried
SELECT tbl.State, tbl.ranges, tbl.race, tbl.origin, tbl.sex, tbl.pop
FROM (select case
when age between 18 and 23 then '18-23'
when age between 24 and 35 then '24-35'
else '36-85' end as ranges,
[State]
,race,
sex,
origin,
sum(pop) as pop
from [StateSexOriginRaceAge]
group by State, age, pop, race, sex, origin, pop
having sex > 0
) as tbl
group by tbl.State, tbl.ranges, tbl.race, tbl.sex, tbl.origin, tbl.pop
order by state, ranges, race, origin, sex
But I get a ton of extra rows, like 20x as many so it’s not doing what I want, which is to add the sum of the populations of 18-23 and put them there and the sums of the population 24-35.
Thanks for any help!
Advertisement
Answer
You are correct in trying to setup conditional aggregation, but your logic is off. Try this version:
SELECT
State,
race,
sex,
origin,
SUM(CASE WHEN age BETWEEN 18 AND 23 THEN pop ELSE 0 END) AS [18-23],
SUM(CASE WHEN age BETWEEN 24 AND 35 THEN pop ELSE 0 END) AS [24-35],
SUM(CASE WHEN age BETWEEN 36 AND 85 THEN pop ELSE 0 END) AS [36-85]
FROM [StateSexOriginRaceAge]
GROUP BY
State,
race,
sex,
origin;
Note that we don’t need any subquery here.