2017-08-13 30 views
1

我有一個包含歷史遷移數據的表。它包含移民來自的國家,地區和城鎮的字段。我想獲得一張表格,顯示每個有100個或更多數據集條目的城鎮的條目數量,以及它們一起提及的地區和國家的數量以及該地區和國家/地區的數據集條目的相應數量。爲什麼我的3 INNER JOIN在不同組和計數的同一張桌子上不適用於sqlite?

如果我做簡單的GROUP BY城鎮,COUNT會爲地區和國家總是在一個城鎮的集團內,這樣我就無法計算該地區和國家的參賽總數。

country | sum_country | region | sum_region | town | sum_town 
Germany | 324,213  | Prussia | 324,213 | Berlin | 324,213 

所以我嘗試了一個INNER JOIN與不同的分組和計數在同一個數據表(使用不同的別名)。

select a.country, c.summe_land, a.last_province, e.summe_region, a.last_town, count (a.last_town) 
from migrant_data as a 

inner join 
(select b.country, count(b.country) as summe_land 
from migrant_data as b group by b.country) as c 
on a.country = c.country 

inner join 
(select d.last_province, count(d.last_province) as summe_region 
from migrant_data as d group by d.last_province) as e 
on a.last_province = e.last_province 

group by a.country, c.summe_land, a.last_province, e.summe_region, a.last_town 
having count(a.last_town) >99 
order by c.summe_land desc, e.summe_region desc, count (a.last_town) desc; 

這工作正常與國家和地區的兩個內部聯接。

country | sum_country | region | sum_region | town | sum_town 
Germany | 4,546,321 | Prussia | 864,345 | Berlin | 324,213 
Germany | 4,546,321 | Unknown | 3,845,321 | Berlin | 640,139 

在結果我發現我有很多的城鎮了在不同國家或地區的情況下提及(作爲歷史數據都不是很一致的)。爲了瞭解這一現象的數量,我想集成第三個INNER JOIN來計算任何國家 - 地區 - 城鎮星座中每個城鎮的入場總數。結果應該是這樣的:

country | sum_country | region | sum_region | town | sum_town | sum_total_town 
Germany | 4,546,321 | Prussia | 864,345 | Berlin | 324,213 | 964,352 
Germany | 4,546,321 | Unknown | 3,845,321 | Berlin | 640,139 | 964,352 

試圖在DB瀏覽器這個查詢SQLite的,我得到的是說,一個錯誤信息:

'near "(": syntax error:' 

這裏是我的代碼無法正常工作:

select a.country, c.summe_land, a.last_province, e.summe_region, a.last_town, g.summe_stadt count (a.last_town) as summe_kombi 
from migrant_data as a 

inner join 
(select b.country, count(b.country) as summe_land 
from migrant_data as b group by b.country) as c 
on a.country = c.country 

inner join 
(select d.last_province, count(d.last_province) as summe_region 
from migrant_data as d group by d.last_province) as e 
on a.last_province = e.last_province 

inner join 
(select f.last_town, count(f.last_town) as summe_stadt 
from migrant_data as f group by f.last_town) as g 
on a.last_town = g.last_town 

group by a.country, c.summe_land, a.last_province, e.summe_region, a.last_town, g.summe_stadt 
having count(a.last_town) >99 
order by c.summe_land desc, e.summe_region desc, count (a.last_town) desc; 

我仔細檢查了我的第三個INNER JOIN,但它的結構完全像前兩個INNER JOIN一樣運作良好。我不知道我該在哪裏或者不應該放置一個括號,或者在所使用的括號旁邊有什麼錯誤。

所以我不知道我做錯了第三個INNER JOIN。我發現了與三個INNER JOIN一起工作的stackoverflow上的各種示例,所以似乎可以聚合三個INNER JOIN。也許我忽略了一些非常簡單的東西,我是SQL查詢的新手(實際上我是歷史學家)。

有什麼建議嗎?感謝您的關注!

回答

1

你錯過了一個逗號befeore計數(a.last_town)...

select 
    a.country 
    , c.summe_land 
    , a.last_province 
    , e.summe_region 
    , a.last_town 
    , g.summe_stadt count(a.last_town) as summe_kombi 
       ^^^ here 

from migrant_data as a 
... 

嘗試使用

select 
    a.country 
    , c.summe_land 
    , a.last_province 
    , e.summe_region 
    , a.last_town 
    , g.summe_stadt 
    , count (a.last_town) as summe_kombi 
    from migrant_data as a 
    inner join (
     select b.country, count(b.country) as summe_land 
     from migrant_data as b group by b.country) as c on a.country = c.country 
    inner join (
     select d.last_province, count(d.last_province) as summe_region 
     from migrant_data as d 
     group by d.last_province) as e on a.last_province = e.last_province 
    inner join (
     select f.last_town, count(f.last_town) as summe_stadt 
     from migrant_data as f 
     group by f.last_town) as g on a.last_town = g.last_town 

    group by a.country, c.summe_land, a.last_province, e.summe_region, a.last_town, g.summe_stadt 
    having count(a.last_town) >99 
    order by c.summe_land desc, e.summe_region desc, count(a.last_town) desc; 
+0

謝謝您的回覆快。逗號做了詭計。並感謝您提供更好的編寫命令的建議,謝爾幫助找到丟失的逗號。我想我將不得不找到一個更好地支持sql語法的編輯器。 – olaf

相關問題