Найти общее количество и среднее на основе значений из другой таблицы - PullRequest
0 голосов
/ 12 марта 2020

В Mysql:

У меня есть имя клиента (первичный ключ), города и сумма в таблице:

Таблица городов:

customer     location        amount

Cust1        New York, USA   200
Cust2        New York, USA   300
Cust3        Chicago, USA    100
Cust4        Paris, France   400
Cust5        Nice, France    500
Cust6        Milan, Italy    600
Cust7        Mumbai, India   0

Формат Имя местоположения в этой таблице:

<city>, <country>

То же, что и:

<city><comma><space><country>

Таблица Страна (первичный ключ):

Name

USA
France
Italy
India
Thailand

Я хочу узнать, как много городов в каждой стране, и среднее количество каждой страны. Как:

Country      Count     Average

USA           3        200      // (200 + 300 + 100) / 3
France        2        450      // (400 + 500) / 2
Italy         1        600      // (600) / 1
India         1        0        // (0) / 1
Thailand      0        0        //  0

Итак, мой запрос:

SELECT t1.name Country, count(distinct t2.location) Count
FROM Country t1 LEFT JOIN Cities t2 
ON t2.location LIKE concat('%, ', t1.name)
GROUP BY t1.name ORDER BY Count DESC

Но он не дает средних данных, он только дает название страны и количество

1 Ответ

2 голосов
/ 12 марта 2020

Вот один из способов сделать это:

select co.name, count(*) cnt, coalesce(avg(amount), 0) avg
from countries co
left join cities ci 
    on ci.location like concat('%, ', co.name)
group by co.name
order by co.name

Обратите внимание, что способ хранения ваших данных неэффективен. Вы должны:

  • отделить название города от страны в двух разных столбцах

  • иметь первичный ключ в таблице стран и сослаться на него в таблице городов

Для вашего набора данных это будет:

Страны

id | name
-- | ---------
 1 | USA
 2 | France
 3 | Italy
 4 | India
 5 | Thailand

Города

id | customer | location | country_id | amount
-- | -------- | -------- | ---------- | ------
 1 | Cust1    | New York |          1 |    200
 2 | Cust2    | New York |          1 |    300
 3 | Cust3    | Chicago  |          1 |    100
 4 | Cust4    | Paris    |          2 |    400
 5 | Cust5    | Nice     |          2 |    500
 6 | Cust6    | Milan    |          3 |    600
 7 | Cust7    | Mumbai   |          4 |      0
...