Encuentra recuento total y el promedio en base de los valores de otra tabla

Usuario del ordenador:

En MySQL:

Tengo el nombre del cliente (clave primaria), ciudades y una cantidad en la tabla:

Las ciudades de mesa:

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

El formato del nombre de la ubicación en esta tabla es:

<city>, <country>

Igual que:

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

Tabla País (clave principal):

Name

USA
France
Italy
India
Thailand

Quiero conseguir el número de ciudades que cada país tiene, y la cantidad promedio de cada país. Me gusta:

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

Por lo tanto, mi pregunta es:

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

Pero no da los datos promedio, sólo se da el nombre de país y Conde

GMB:

Esta es una manera de hacerlo:

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

Tenga en cuenta que la forma en que se almacenan los datos es ineficiente. Debieras:

  • separar el nombre de la ciudad desde el país en dos columnas diferentes

  • tener una clave principal en la tabla de países, y hacer referencia a ella en la tabla de ciudades

Para el conjunto de datos, esto sería:

Países

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

ciudades

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=279866&siteId=1
Recomendado
Clasificación