2014-02-12 95 views
0

我有这种关系; 国家(名称,代码,首都,省份,地区,人口)SQL函数和按结果排序?

我想从哪里获得语言(姓名),每种语言的母语人数。

我很确定我几乎完成了这个,但我不认为我已经得到了什么“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。

+0

嗯,首先,你真的不需要作为group by子句的DISTINCT限定符指定了您希望计数所基于的字段。您将得到“1”作为计数,因为DISTINCT最终会为您提供每行结果的一行。其次,它看起来像你试图做每个国家*的百分比计算,但试图对整个语言进行计数... –

+0

是否使用'SUM'而不是'COUNT'工作' 1.name'? – Sev09

+0

这个查询中的ORDER BY'在哪里,你可能是指'GROUP BY'? –

回答

0

我不是PostgreSQL的专家,但我认为你犯了一个痘痘分组错误。你是分组在英语为母语国家列,但你真正想要的总和。所有的英语为母语国家尝试以下操作:

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; 

,如果你想用它更捣鼓一些: http://www.sqlfiddle.com/#!15/0d0bc/3

0

你只是试图找出有多少人讲各种语言。如果是这样,这个M&飞行是一个更好的方法来组织查询:

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 
+0

Doh!彼得打败了我... – Ash8087

+0

不是真的......我添加了所有母语的总和。可能是他想要每个国家/语言一行。那么你的解决方案更适合工作。他想要做什么并不是很清楚...... – Pieter

1

尝试:

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 

编辑 - 固定的拼写错误“县”与国家