columns sql sql-server-2008-r2 pivot unpivot

rows to columns sql



SQL Server Exact Table Transpose (2)

Gran uso para pivot y unpivot :

with t as ( select ''Jan'' as mon, cast(10.0 as float) as high, cast(9.0 as float) as low, cast(9.5 as float) as average union all select ''Feb'' as mon, 8.0, 7.0, 7.5 ) select stat, Jan, Feb, Mar from (select mon, STAT, value from t unpivot (value for stat in (high, low, average)) u ) t pivot (max(value) for mon in (Jan, Feb, Mar)) as pt

¿Cómo se logra una transposición exacta en SQL?

Month | High | Low | Avg ------------------------- Jan | 10 | 9 | 9.5 ------------------------- Feb | 8 | 7 | 7.5 ------------------------- Mar | 7 | 6 | 6.5 -------------------------

Resultado

------ Jan | Feb | Mar -------------------------- High-- 10 | 8 | 7 -------------------------- Low-- 9 | 7 | 6 -------------------------- Avg 9.5 | 7.5 | 6.5 --------------------------


Para obtener el resultado, primero deberá desvincular las columnas High , Low y Avg al convertirlas en filas. Luego, aplicará la función de pivote para convertir los valores del month en columnas. (Consulte: documentos de MSDN PIVOT / UNPIVOT )

Como está utilizando SQL Server 2008+, puede usar CROSS APPLY y VALUES para unpivot. El código para unpivot es:

select t.month, c.col, c.value from yourtable t cross apply ( values (''High'', high), (''Low'', Low), (''Avg'', Avg) ) c (col, value)

Ver SQL Fiddle con demostración . Esto da el resultado en un formato que luego se puede pivotar por mes:

| MONTH | COL | VALUE | ------------------------ | Jan | High | 10 | | Jan | Low | 9 | | Jan | Avg | 9.5 | | Feb | High | 8 | | Feb | Low | 7 |

Una vez que los datos están en filas, aplica la función de pivote, por lo que el código será:

select col, Jan, Feb, Mar from ( select t.month, c.col, c.value from yourtable t cross apply ( values (''High'', high), (''Low'', Low), (''Avg'', Avg) ) c (col, value) ) d pivot ( sum(value) for month in (Jan, Feb, Mar) ) piv

Ver SQL Fiddle con demostración . Esto da el resultado:

| COL | JAN | FEB | MAR | -------------------------- | Avg | 9.5 | 7.5 | 6.5 | | High | 10 | 8 | 7 | | Low | 9 | 7 | 6 |

Como está pivotando nombres de mes, dudo que necesite una versión SQL dinámica de esto, pero si tuviera una cantidad desconocida de valores, entonces podría usar sql dinámico para obtener el resultado.