SELECT COUNT(median_age) 'Frequency',
CASE
WHEN median_age < 20 THEN 'Terrible'
WHEN median_age < 30 THEN 'Low'
WHEN median_age < 40 THEN 'Medium'
ELSE 'High'
END Life_Expectancy
FROM countries
GROUP BY Life_Expectancy
ORDER BY median_age;
Sorry in advance if this has been asked before im new to this site and SQL. The Above code works perfectly however my column name is Life_expectancy. I can change the END line to 'Life Expectancy' which is my aim. However when i do this i can no longer group my data in the GROUP BY line. If i try to group by 'Life Expectancy' it simply averages all my data which isnt very usefull.
Desired output: Currently acheived with above code
Frequency Life_Expectancy
32 Terrible
63 Low
57 Medium
49 High
Output if i change it to 'Life Expectancy':
Frequency Life Expectancy
201 Medium
CodePudding user response:
Escape the alias name in quotes:
SELECT COUNT(median_age) 'Frequency',
CASE WHEN median_age < 20 THEN 'Terrible'
WHEN median_age < 30 THEN 'Low'
WHEN median_age < 40 THEN 'Medium'
ELSE 'High'
END AS "Life Expectancy"
FROM countries
GROUP BY 2
ORDER BY
CASE "Life Expectancy" WHEN 'Terrible' THEN 1
WHEN 'Low' THEN 2
WHEN 'Medium' THEN 3
ELSE 4 END;
The ugliness of the ORDER BY clause has to do with that the only things which can appear there are the count and the aliased Life Expectancy. So using my approach I was forced to derive another CASE expression to generate the desired ordering.
