Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server - PIVOT - due colonne in righe

Esistono diversi modi per ottenere il risultato desiderato. Simile a @Sheela K R's risposta puoi usare una funzione aggregata con un'espressione CASE ma può essere scritta in modo più conciso:

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;

Vedi SQL Fiddle con demo .

Questo potrebbe anche essere scritto usando la funzione PIVOT, tuttavia dal momento che vuoi ruotare più colonne, vorresti prima cercare di annullare il pivot del tuo First e Last colonne.

Il processo unpivot convertirà le tue colonne multiple in più righe di dati. Non hai specificato quale versione di SQL Server stai utilizzando, ma puoi utilizzare un SELECT con UNION ALL con CROSS APPLY o anche il UNPIVOT funzione per eseguire la prima conversione:

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

Vedi SQL Fiddle con demo . Questo converte i tuoi dati nel formato:

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

Una volta che i dati sono in più righe, puoi facilmente applicare la funzione 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;

Vedi SQL Fiddle con demo

Entrambi danno un risultato di:

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