2017-08-13 3 views
1

J'ai une table avec des données de migration historiques. Il contient des champs pour le pays, la région et la ville d'où viennent les migrants. Je veux obtenir un tableau qui montre pour chaque ville avec 100 entrées de jeu de données ou plus le nombre d'entrées avec la région et le pays, il est mentionné ensemble et les comptes respectifs des entrées de jeu de données pour la région et le pays. Si je fais un simple GROUP BY ville le COUNT pour la région et le pays sera toujours dans le groupe d'une ville de sorte que je ne peux pas compter le montant total des entrées pour la région et le pays. J'ai donc essayé un INNER JOIN avec un groupement différent et compté sur la même table de données (en utilisant un alias différent).Pourquoi mon INNER JOIN 3 sur la même table avec différents groupes et comptes ne fonctionne pas avec sqlite?

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; 

Cela a fonctionné correctement avec deux jointures internes pour le pays et la région.

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 

En conséquence, je découvert que j'ai beaucoup de villes qui sont mentionnés dans différents contextes de pays ou d'une région (comme les données historiques ne sont pas très cohérentes). Pour avoir une idée de la quantité de ce phénomène, je veux intégrer un troisième INNER JOIN pour compter le nombre total d'entrées pour chaque ville dans n'importe quelle constellation de pays - région - ville. Le résultat devrait ressembler à ceci:

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 

Essayer cette requête dans DB Browser pour SQLite je reçois un message d'erreur qui disent:

'near "(": syntax error:' 

Voici mon code qui ne fonctionne pas:

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; 

J'ai vérifié deux fois mon troisième INNER JOIN mais il est structuré exactement comme les deux premiers INNER JOIN qui ont bien fonctionné. Je ne sais pas où je devrais ou ne devrais pas mettre un support ou ce qui ne va pas à côté de l'un des supports utilisés. Donc, je ne sais pas ce que j'ai fait de mal avec le troisième INNER JOIN. J'ai trouvé divers exemples sur stackoverflow qui fonctionnent avec trois INNER JOIN donc il semble possible d'agréger trois INNER JOIN. Peut-être que j'ai négligé quelque chose de très simple, je suis relativement nouveau aux requêtes SQL (en fait je suis historien).

Des suggestions? Merci de votre attention!

Répondre

1

Vous avez manqué une virgule befeore le nombre (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 
... 

essayez d'utiliser

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

Merci pour votre réponse rapide. La virgule a fait l'affaire. Et merci pour le conseil de mieux écrire les commandes, que shure aide à trouver des virgules manquantes. Je pense que je devrai trouver un éditeur qui supporte mieux la syntaxe sql. – olaf