SQL函数和按结果排序?
我有这种关系; 国家(名称、代码、首都、省份、地区、人口) 我想从哪里获得语言(名称),以英语为母语的国家数量以及每种语言的母语人数 我很确定我几乎完成了这个,但我不认为我已经掌握了“ORDER BY”的真正用途,因为我对count(l.name)的计算变得混乱,只有当我确定这个数据库包含某些国家使用某种语言的信息时,我才能得到值“1”SQL函数和按结果排序?,sql,database,function,postgresql,Sql,Database,Function,Postgresql,我有这种关系; 国家(名称、代码、首都、省份、地区、人口) 我想从哪里获得语言(名称),以英语为母语的国家数量以及每种语言的母语人数 我很确定我几乎完成了这个,但我不认为我已经掌握了“ORDER BY”的真正用途,因为我对count(l.name)的计算变得混乱,只有当我确定这个数据库包含某些国家使用某种语言的信息时,我才能得到值“1” SELECT DISTINCT l.name, count(l.name) as SpokenIn, l.percentage*c.population as
SELECT DISTINCT l.name, count(l.name) as SpokenIn,
l.percentage*c.population as NativeSpeakers
FROM (country c
JOIN language l
ON c.code = l.country)
GROUP BY l.name, NativeSpeakers;
所有其他行都很好,只有“SpokenIn”关系混乱。我做错了什么:(
我正在使用PostgreSQL。我不是PostgreSQL专家,但我认为您犯了一个轻微的分组错误。您正在对NativeSpeakers列进行分组,但实际上需要所有NativeSpeaker的总和。请尝试以下操作:
SELECT l.name, count(c.name) as SpokenIn,
sum(l.percentage*c.population) as NativeSpeakers
FROM (country c
JOIN language l
ON c.code = l.country)
GROUP BY l.name;
如果你想再摆弄一些:
您只是想知道有多少人会说每种语言吗?如果是这样,这可能是构造查询的更好方法:
SELECT DISTINCT l.name, sum(l.percentage*c.population) as SpokenBy
FROM (country c
JOIN language l
ON c.code = l.country)
GROUP BY l.Name
尝试:
Edit-修复了拼写错误“countries”与“countries”首先,您确实不需要不同的限定符,因为group by子句指定了您希望计数基于的字段。您得到的是“1”作为计数,因为DISTINCT最终为每个结果提供一行。第二,看起来您试图对每个国家进行百分比计算,但试图对整个语言进行计数…使用
总和而不是计数来处理1.name
?ORDER BY
i在哪里在这个查询中,您的意思可能是分组方式
?创建一个SQLFIDLE最有帮助,这样答案就可以很容易地验证。不是真的……我加上了所有本地说话人的总和。可能是他希望每个国家/语言都有一行。那么您的解决方案更适合使用。他到底想做什么还不是很清楚做
select l.name,
counter.num_countries as SpokenIn,
sum(l.percentage * c.population) as NativeSpeakers
from country c
join language l
on c.code = l.country
join (select name, count(country) as num_countries
from language
group by name) counter
on l.name = counter.name
group by l.name, counter.num_countries