@Omniverse

Как создать такой SQL-запрос?

Здравствуйте.

Есть три таблицы:
country
c26e0172715e4994b033f51c9869a305.png
city
3b725412032940da8e3ef3f40bfa90d6.png
countrylanguage
99a60dd525624d988a64da85309128af.png

Надо вывести результирующую таблицу типа:
237a1aa06753469dbe7fae4869294d87.png

У меня получилось вывести все, кроме количества городов и языков для каждого региона:
SELECT Continent, Region, COUNT(Name) as Countries, ROUND(AVG(LifeExpectancy), 2) as LifeDuration, SUM(Population) as Population
FROM `country`
GROUP BY Region
ORDER BY Continent, Region


Как вывести еще 2 столбца (кол-во городов и языков для каждого региона)?
  • Вопрос задан
  • 756 просмотров
Решения вопроса 1
@nozzy
Symfony, Laravel, SQL
select
t3.Continent,
t3.Region,
sum(t3.Countries),
sum(t3.LifeDuration),
sum(t3.Population),
sum(t3.Cities),
sum(t4.Languages)
from
(
select
  t1.Code,
  t1.Continent,
  t1.Region,
  t1.Countries,
  t1.LifeDuration,
  t1.Population,
  t2.Cities
  from
   ( 
     select
     Code,
     Continent,
     Region,
     count(Name) as Countries,
     ROUND(AVG(LifeExpectancy), 2) as LifeDuration, 
     SUM(Population) as Population
     from country
     group by Code,Continent,Region
) t1 left join 
(
  select
  CountryCode,
  count(Name) as Cities
  from city
  group by CountryCode 
) t2 on t2.CountryCode = t1.Code
) t3 left join 
(
  select 
  CountryCode,
  count(Language) as Languages
  from countrylanguage
) t4 on t4.CountryCode = t3.Code

group by t3.Continent,t3.Region
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Igor-Maf
@Igor-Maf
Senior Front End developer
Добрый день, попробуйте посмотреть в сторону JOIN-ов.
Ответ написан
Комментировать
@Omniverse Автор вопроса
Пробовал сделать такой запрос с join'ами:
SELECT a.Continent, a.Region, COUNT(a.Name) as Countries, 
       ROUND(AVG(a.LifeExpectancy), 2) as LifeDuration, SUM(a.Population) as Population, 
       COUNT(b.name) as cities, COUNT(c.Language) as Languages 
FROM `country` as a 
LEFT JOIN city as b 
ON a.Code = b.CountryCode 
LEFT JOIN countrylanguage as c 
ON a.Code = c.CountryCode 
GROUP BY a.Region 
ORDER BY a.Continent, a.Region


Но выводится такая ерунда:
72cdb42ef442476e90dbf95332b473f2.png

По сути я знаю как по отдельности в 3 запроса вывести все столбцы:
Continent, Region, Countries, LifeDuration, Population:
SELECT Continent, Region, COUNT(Name) as Countries, ROUND(AVG(LifeExpectancy), 2) as LifeDuration, SUM(Population) as Population
FROM `country`
GROUP BY Region
ORDER BY Continent, Region

Cities:
SELECT COUNT(b.name) as cities 
FROM `country` as a
LEFT JOIN city as b
ON a.Code = b.CountryCode
GROUP BY a.Region
ORDER BY a.Continent, a.Region

Languages:
SELECT COUNT(c.Language) as Languages 
FROM `country` as a
LEFT JOIN countrylanguage as c
ON a.Code = c.CountryCode
GROUP BY a.Region
ORDER BY a.Continent, a.Region


Как объединить эти три запроса в один, чтоб вывелась результирующая таблица?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы