2017-02-11 7 views
0

Ich habe zwei Tabellen: GRENZEN mit country1, county2, COUNTRYPOPS mit Land, Jahr und Bevölkerung, und ich möchte für jedes Land, seine Bevölkerung und die Gesamtbevölkerung aller Nachbarländer auflisten (und wenn Es hat keine Nachbarländer, NULL) Bisher kann ich die maximale Bevölkerung für jedes Land finden und wie viele Nachbarn jedes Land hat, aber ich kann keinen Weg finden, die Bevölkerung aller Nachbarländer zusammenzufassen. Irgendwelche Ideen?zählen und summieren die Werte sql

SELECT country, MAX(population) FROM COUNTRYPOPS GROUP BY 1 ORDER BY 1 
--------------- 
SELECT countries, COUNT(countries) as have_borders 
FROM 
(SELECT country1 AS countries 
FROM borders 
UNION ALL 
SELECT country2 
FROM borders) t 
GROUP BY countries 
ORDER BY countries; 
+1

Ist dies MySql oder SQL Server? Bitte markieren Sie entsprechend. –

+1

Ist 'BORDERS' bidirektional? Z.B. eine Reihe mit 'USA',' KANADA' und eine andere Reihe mit 'KANADA',' USA', oder hat es nur Reihen in einer (beliebigen) Richtung? – Andreas

+0

ja es ist bidirektional – jack

Antwort

0

Wie wäre es so etwas wie

SELECT country, pop, SUM(cc.population) AS neighboursPop 
FROM (
    SELECT c.country AS country, c.population AS pop, b.country2 AS neighbour 
    FROM countrypops c 
     LEFT JOIN borders b ON b.country1 = c.country 
    ) t 
     LEFT JOIN countrypops cc ON cc.country = t.neighbour 
GROUP BY country; 

Hat es nicht testen, aber die Idee ist, dass.

UPD: oder es sogar wie abgeflacht werden kann

SELECT country, pop, SUM(neighPop) AS neighboursPop 
FROM (
    SELECT 
     c.country AS country, 
     c.population AS pop, 
     b.country2 AS neighbour, 
     cc.population AS neighPop 
    FROM countrypops c 
     LEFT JOIN (borders b 
        LEFT JOIN countrypops cc ON cc.country = b.country2) 
     ON b.country1 = c.country 
    ) t 
GROUP BY country; 
0

Ich denke, eine korrelierte Unterabfrage ist der einfachste Weg:

select cp.country, cp.pop, 
     (select sum(cp2.pop) 
     from borders b join 
      countrypops cp2 
      on b.country2 = cp2.country 
     where b.country1 = cp.country 
     ) as neighboring_pop 
from countrypops cp; 

Dies stellt keine Aggregation in der äußeren Abfrage, so dass es sollte effizienter sein als ein Ansatz, der dies tut.

Verwandte Themen