SQL函数和按结果排序?

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

我有这种关系; 国家(名称、代码、首都、省份、地区、人口)

我想从哪里获得语言(名称),以英语为母语的国家数量以及每种语言的母语人数

我很确定我几乎完成了这个,但我不认为我已经掌握了“ORDER BY”的真正用途,因为我对count(l.name)的计算变得混乱,只有当我确定这个数据库包含某些国家使用某种语言的信息时,我才能得到值“1”

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