Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server - PIVOT - duas colunas em linhas


Existem algumas maneiras diferentes de obter o resultado desejado. Semelhante a @Sheela K Rs resposta, você pode usar uma função agregada com uma expressão CASE, mas pode ser escrita de uma maneira mais 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 with Demo .

Isso também pode ser escrito usando a função PIVOT, no entanto, como você deseja dinamizar várias colunas, primeiro você deseja ver como não dinamizar seu First e Last colunas.

O processo unpivot converterá suas várias colunas em várias linhas de dados. Você não especificou qual versão do SQL Server está usando, mas pode usar um SELECT com UNION ALL com CROSS APPLY ou até mesmo o UNPIVOT função para realizar a primeira conversão:
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 with Demo . Isso converte seus dados no formato:
|    COL |       VALUE |
|--------|-------------|
| First1 | RandomName1 |
|  Last1 | RandomLast1 |
| First2 | RandomName2 |
|  Last2 | RandomLast2 |

Quando os dados estiverem em várias linhas, você poderá aplicar facilmente a função 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 with Demo

Ambos dão um resultado de:
|      FIRST1 |       LAST1 |      FIRST2 |       LAST2 |      FIRST3 |       LAST3 |      FIRST4 |       LAST4 |      FIRST5 |       LAST5 |
|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|
| RandomName1 | RandomLast1 | RandomName2 | RandomLast2 | RandomName3 | RandomLast3 | RandomName4 | RandomLast4 | RandomName5 | RandomLast5 |