sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server - PIVOT - dos columnas en filas

Hay algunas maneras diferentes en las que puede obtener el resultado que desea. Similar a @Sheela K R's respuesta puede usar una función agregada con una expresión CASE pero puede escribirse de una manera más concisa:

select 
  max(case when rowid = 1 then first end) First1,
  max(case when rowid = 1 then last end) Last1,
  max(case when rowid = 2 then first end) First2,
  max(case when rowid = 2 then last end) Last2,
  max(case when rowid = 3 then first end) First3,
  max(case when rowid = 3 then last end) Last3,
  max(case when rowid = 4 then first end) First4,
  max(case when rowid = 4 then last end) Last4,
  max(case when rowid = 5 then first end) First5,
  max(case when rowid = 5 then last end) Last5
from yourtable;

Consulte SQL Fiddle con demostración .

Esto también podría escribirse usando la función PIVOT, sin embargo, dado que desea girar varias columnas, primero querrá ver cómo desgirar su First y Last columnas

El proceso de no pivotar convertirá sus múltiples columnas en múltiples filas de datos. No especificó qué versión de SQL Server está usando, pero puede usar SELECT con UNION ALL con CROSS APPLY o incluso el UNPIVOT función para realizar la primera conversión:

select col = col + cast(rowid as varchar(10)), value
from yourtable
cross apply 
(
  select 'First', First union all
  select 'Last', Last
) c (col, value)

Consulte SQL Fiddle con demostración . Esto convierte sus datos al formato:

|    COL |       VALUE |
|--------|-------------|
| First1 | RandomName1 |
|  Last1 | RandomLast1 |
| First2 | RandomName2 |
|  Last2 | RandomLast2 |

Una vez que los datos están en varias filas, puede aplicar fácilmente la función PIVOT:

select First1, Last1, 
  First2, Last2,
  First3, Last3, 
  First4, Last4, 
  First5, Last5
from
(
  select col = col + cast(rowid as varchar(10)), value
  from yourtable
  cross apply 
  (
    select 'First', First union all
    select 'Last', Last
  ) c (col, value)
) d
pivot
(
  max(value)
  for col in (First1, Last1, First2, Last2,
              First3, Last3, First4, Last4, First5, Last5)
) piv;

Consulte SQL Fiddle con demostración

Ambos dan un resultado de:

|      FIRST1 |       LAST1 |      FIRST2 |       LAST2 |      FIRST3 |       LAST3 |      FIRST4 |       LAST4 |      FIRST5 |       LAST5 |
|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|
| RandomName1 | RandomLast1 | RandomName2 | RandomLast2 | RandomName3 | RandomLast3 | RandomName4 | RandomLast4 | RandomName5 | RandomLast5 |