Forum Discussion

RaulSG's avatar
RaulSG
Brass Contributor
Mar 21, 2021

Como hacer un UNPIVOT de más de una columna

Tengo que crear una vista en SQL Server haciendo un UNPIVOT de una tabla y no consigo hacerlo correctamente. A partir de una tabla origen como la primera, tengo que conseguir la segunda:

 

Tablas

 

¿Cómo tendría que ser la consulta SQL para conseguir esta vista a partir de la tabla original? Los colores es simplemente para saber como se tienen que distribuir los valores en la consulta resultado.

Cualquier ayuda será bien recibida. Muchas gracias!

  • RaulSG 
    Me contesto a mi mismo gracias a la respuesta que me ha proporcionado jachguate.

     

    Hacer un unpivot de una única columna (el Tramo), y luego quieres dejar en una única columna el valor de varias columnas del origen, dependiendo de cuál tramo resulte tener cada fila del resultado.

    Para lograrlo, puedes hacer el unpivot normal, incluyendo ambas columnas (P1, P2) en el resultado, para finalmente, valiéndote de una sentencia case formar la columna P con el valor que corresponda (P1 o P2) según el Tramo.

    Este es uno de aquellos casos dónde un poco de código vale más que mil palabras. Suponiendo que tu tabla origen se llama base, esta sentencia te da el resultado:

    select   IDBarem
           , IDTipo
           , Tramo
           , Nota
           , case 
               when Tramo = '50-54' then P1
               when Tramo = '55-59' then P2
             end P
      from (select IDBarem, IDTipo, P1, P2, [50-54], [55-59]
              from base) p
           unpivot (Nota for Tramo in ([50-54], [55-59])) as unpvt

    Funciona perfectamente.
    Muchas gracias!

     

  • RaulSG's avatar
    RaulSG
    Brass Contributor

    RaulSG 
    Me contesto a mi mismo gracias a la respuesta que me ha proporcionado jachguate.

     

    Hacer un unpivot de una única columna (el Tramo), y luego quieres dejar en una única columna el valor de varias columnas del origen, dependiendo de cuál tramo resulte tener cada fila del resultado.

    Para lograrlo, puedes hacer el unpivot normal, incluyendo ambas columnas (P1, P2) en el resultado, para finalmente, valiéndote de una sentencia case formar la columna P con el valor que corresponda (P1 o P2) según el Tramo.

    Este es uno de aquellos casos dónde un poco de código vale más que mil palabras. Suponiendo que tu tabla origen se llama base, esta sentencia te da el resultado:

    select   IDBarem
           , IDTipo
           , Tramo
           , Nota
           , case 
               when Tramo = '50-54' then P1
               when Tramo = '55-59' then P2
             end P
      from (select IDBarem, IDTipo, P1, P2, [50-54], [55-59]
              from base) p
           unpivot (Nota for Tramo in ([50-54], [55-59])) as unpvt

    Funciona perfectamente.
    Muchas gracias!

     

Resources