如何解决SQL中2列的%diff
我有2个表-国家(标识,名称,洲)和人口_年(标识,人口,年,国家/地区)。数据来自2000年至2010年,我正在尝试计算此时间段内各大洲的平均人口差异百分比。我正在尝试通过创建一个临时表来产生此结果:
但是当我尝试计算%diff时(如下面的代码所示),我不知道如何在代码中引用'avg pop 2000'和'avg pop 2010'列没有分配一个我可以引用的变量。在代码中,我使用了avg_pop_2010和avg_pop_2000来引用这些列-显然,这实际上不起作用。
WITH avg_pop AS( SELECT countries.continent,ROUND(AVG(CASE WHEN population_years.year = 2000 THEN population_years.population END),2) as 'avg pop 2000',ROUND(AVG(CASE WHEN population_years.year = 2010 THEN population_years.population END),2) as 'avg pop 2010'
FROM countries
JOIN population_years
WHERE population_years.country_id = countries.id
GROUP BY 1)
SELECT countries.continent,ROUND(((avg_pop_2010 - avg_pop_2000)/avg_pop_2000)*100.0,2) AS '%diff'
FROM avg_pop;
解决方法
WITH avg_pop AS( SELECT countries.continent,ROUND(AVG(CASE WHEN population_years.year = 2000 THEN population_years.population END),2) as avg_pop_2000,ROUND(AVG(CASE WHEN population_years.year = 2010 THEN population_years.population END),2) as avg_pop_2010
FROM countries
JOIN population_years
WHERE population_years.country_id = countries.id
GROUP BY 1)
SELECT continent,ROUND((( avg_pop_2000 - avg_pop_2010)/avg_pop_2010)*100,2) AS '%diff'
FROM avg_pop;
这是一个小演示:
在检查其他评论和答案时,我意识到您需要给不带''的别名,所有别名都可以使用...我已经更新了答案和演示。
,另一种选择是重复表达式-进行一些优化:
select
c.continent,round(avg(case when py.year = 2000 then py.population end),2) avg_pop_2000,round(avg(case when py.year = 2010 then py.population end),2) avg_pop_2010,round(
100.* avg(case when py.year = 2010 then py.population else - py.population end)
/ avg(case when py.year = 2000 then py.population end),2
) percent_diff
from countries c
inner join population_years py on py.country_id = c.id
where py.year in (2010,2020)
group by c.continent
旁注:
-
请勿将单引号用作标识符!它们代表标准SQL中的文字字符串。通常,您应该首选不需要加引号的标识符。如果需要引用,请使用SQLite可以识别的标准双引号(
"
) -
使用
where
子句对相关年份进行预过滤使查询效率更高 -
使用标准连接语法;连接条件转到连接的
on
子句,而不是where
子句
四舍五入,然后计算百分比差是不准确的;先计算,然后四舍五入
-
表别名使查询更易于编写和读取
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。