En representación de datos SQL para varias ciudades en base a la columna año

Bhavesh Parvatkar:

Tengo una tabla que consta de datos de la ciudad y la temperatura de varios años.

|-----------------------|
| Year  | City  | Temp  |
|-----------------------|
| 2000  | City1 | 25    |
| 2000  | City2 | 29    |
| 2000  | City3 | 35    |
| 2001  | City1 | 17    |
| 2002  | City2 | 28    |
| 2003  | City3 | 19    |
|-----------------------|

Quiero representar los datos de la siguiente manera.

|-------------------------------|
| Year  | City1 | City2 | City3 |
|-------------------------------|
| 2000  | 25    | 29    | 35    |
| 2001  | 17    | 28    | 19    |
|-------------------------------|

He de representar a cada ciudad, cada uno con una sub-tabla con la whencláusula y luego unirse a ella o hay otra forma sencilla?

Caius Jard:

Puede hacerlo de esa manera, seguro o puede buscar en hacer esto, normalmente llamada de agregación condicional:

SELECT
  year,
  MAX(CASE WHEN city = 'City1' THEN temp END) as City1,
  MAX(CASE WHEN city = 'City2' THEN temp END) as City2,
  MAX(CASE WHEN city = 'City3' THEN temp END) as City3
FROM t
GROUP BY year

Si ejecuta este verá cómo funciona: la ciudad es la primera difusión a cabo a través de muchas columnas:

SELECT
  year,
  CASE WHEN city = 'City1' THEN temp END as City1,
  CASE WHEN city = 'City2' THEN temp END as City2,
  CASE WHEN city = 'City3' THEN temp End as City3
FROM t

Entonces, cuando todo se agrupa, la función MAX ignorará los nulos y sólo recoger las células con los datos, lo cual es una por columna

Si usted tenía varias grabaciones temporales por ciudad y año tal vez podría utilizar AVG en su lugar, para obtener el promedio de ellos, o MIN, MAX, etc. Toda una técnica flexible,

Información que está recibiendo un front-end para dar un máximo de 3 ciudades, entonces puede tener parámetros para los nombres:

SELECT
  year,
  MAX(CASE WHEN city = @c1 THEN temp END) as City1,
  MAX(CASE WHEN city = @c2 THEN temp END) as City2,
  MAX(CASE WHEN city = @c3 THEN temp END) as City3
FROM t
WHERE City IN (@c1, @c2, @c3)
GROUP BY year

Usted no puede (ni debe) parametrizar los nombres de las columnas sin embargo. Su parte delantera tendrá que poner el nombre de la ciudad justo en el informe cuando se tira de los datos, como este pseudocódigo:

labelCity1.Text = "Paris"
labelTemp1.Text = queryResult.GetInt("city1")
...

Supongo que te gusta

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