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
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