2017-02-11 5 views
0

У меня есть две таблицы: BORDERS with country1, county2, COUNTRYPOPS со страной, годом и населением, и я хочу для каждой страны перечислить ее население и общее население всех соседних стран. (И если у него нет соседних стран, NULL) Пока я могу найти максимальное количество населения для каждой страны и сколько соседей в каждой стране, но я не могу найти способ подытожить население всех соседних стран. Есть идеи?подсчитывать и суммировать значения 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

Является ли этот MySql или SQL Server? Пожалуйста, отметьте соответствующим образом. –

+1

Является ли 'BORDERS' двунаправленным? Например. одна строка с «США», «КАНАДА» и еще одна строка с «КАНАДА», «США», или она имеет только строки в одном (произвольном) направлении? – Andreas

+0

да это двунаправленный – jack

ответ

0

Как о чем-то вроде

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; 

не проверял, но идея состоит в том, что.

UPD: или это может даже быть уплощен как

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

Я думаю, что коррелированных подзапросов является самым простым способом:

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; 

Это не имеет агрегации во внешнем запросе, поэтому его должен быть более эффективным, чем подход, который делает.

Смежные вопросы