2014-02-12 99 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 

編輯 - 固定的拼寫錯誤「縣」與國家