Tengo una tabla (city_data) con las columnas 'año', 'city_name' y 'avg_temp'. La otra tabla es global_data y tiene las columnas 'avg_temp' y 'year'. Estoy tratando de crear una tabla que tenga la temperatura promedio de Londres, la temperatura promedio global de todos los años. Mi código SQL es el siguiente:

SELECT city_data.avg_temp, city_data.year
FROM city_data
JOIN global_data
ON city_data.year = global_data.avg_temp
WHERE city= 'Paris'

No recibo ningún error, pero no puedo obtener el resultado esperado. Creo que no puedo entender lo que necesito poner en la cláusula ON.

0
Louis 14 jun. 2020 a las 17:02

4 respuestas

La mejor respuesta

Supongo que la tabla global_data tiene una fila por año, mientras que city_data tiene una fila por año y ciudad. Esto significa que simplemente puede unir los dos en el año que tienen en común:

select year, g.avg_temp as global_average, c.avg_temp as paris_average
from global_data g
join city_data c using (year)
where c.city = 'Paris'
order by year;

Si no le gusta unirse a los dos y solo mencionar París, también puede convertir esto en:

select year, g.avg_temp as global_average, p.avg_temp as paris_average
from global_data g
join (select * from city_data where city = 'Paris') p using (year)
order by year;

A partir de MySQL 8, incluso puede usar una cláusula WITH para "preparar" París :-)

with paris as (select * from city_data where city = 'Paris')
select year, g.avg_temp as global_average, paris.avg_temp as paris_average
from global_data g
join paris using (year)
order by year;

O considere París como un criterio de unión:

select g.year, g.avg_temp as global_average, p.avg_temp as paris_average
from global_data g
join city_data p on p.year = g.year and p.city = 'Paris'
order by g.year;

Como puede ver, hay muchas formas de escribir la misma consulta y el DBMS probablemente propondrá el mismo plan de ejecución para todos. Por lo tanto, simplemente elija la consulta que más le guste.

0
Thorsten Kettner 14 jun. 2020 a las 17:43

Como year es el único atributo común, únete usándolo. Luego busque la tabla de promedio de la ciudad, ya que está disponible en city_data. Por último, haga el promedio de global_data, ya que desea obtenerlo a través de los años.

SELECT `city_name`, `city_data`.`avg_temp` AS city_avg_temp, AVG(`global_data`.`avg_temp`) AS global_avg_temp
    FROM `city_data`
    JOIN `global_data` 
        ON `city_data`.`year` = `global_data`.`year`
    WHERE `city_name` = 'London'
    GROUP BY `city_data`.`city_name`
0
Swatantra Kumar 14 jun. 2020 a las 14:54

Esto se basa completamente en la comprensión parcial.

SELECT city_name, AVG(city_data.avg_temp) as global_avg
    FROM
    city_data
    JOIN global_data
    ON city_data.year = global_data.year
    WHERE city_name = 'Paris'
    GROUP BY city_data.city_name
0
dsk 14 jun. 2020 a las 14:23
FROM city_data
JOIN global_data
ON city_data.year = global_data.year

- debería estar global_data.year en Join

WHERE city= 'Paris'
0
dsk 14 jun. 2020 a las 14:34