sql >> Base de Datos >  >> Database Tools >> SSMS

Transponer grupos de filas con la misma ID en otra tabla

Esto es de hecho un pivote, también llamado tabulación cruzada o, a veces, transposición

Algunas bases de datos tienen instalaciones dedicadas para hacerlo, otras tiene que usar una sintaxis de agrupación. Prefiero este último porque funciona universalmente

Si te sirve de consuelo, ¡estabas muy cerca!

SELECT
    DIM_KEY,
    MAX(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END) as UPC,
    MAX(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END) as DAIRY_CLM,
    MAX(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END) as KOSHER_CLM,
    MAX(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END) as FAT,
    MAX(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END) as CALORIES
FROM demo
GROUP BY DIM_KEY

¿Cómo funciona?

Bueno, si ejecuta la versión no agrupada y sin funciones máximas que ya tenía:

SELECT
    DIM_KEY,
    (CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END)
FROM
   demo

Luego verá que sus datos se vuelven "diagonales":

3005, 123423, null, null...
3005, null,   N,    null...
3005, null,   null, Y   ...

En cada columna (por dim_key) solo hay un valor, el resto son NULL

Agregar GROUP BY y MAX hace que estos se colapsen en una sola fila porque MAX() devolverá solo el valor de la columna y hará que desaparezcan todos los valores nulos. Es una propiedad intrínseca de una agrupación, que los datos de fila no "permanecen juntos":dentro del grupo de una DIM_KEY en particular, MAX(DAIRY_CLM) puede provenir de cualquier fila, MAX(KOSHER_CLM) puede provenir de cualquier otra fila. En la práctica, esto significa que se seleccionan los valores individuales, los valores nulos se descartan y todos aparecen en la misma fila.

..y así sus datos verticales se volvieron horizontales, después de pasar por la diagonal