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.