Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server - PIVOT - deux colonnes en lignes

Il existe plusieurs façons d'obtenir le résultat souhaité. Similaire à @Sheela K R's réponse, vous pouvez utiliser une fonction d'agrégation avec une expression CASE mais elle peut être écrite de manière plus concise :

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;

Voir SQL Fiddle avec démo .

Cela pourrait également être écrit à l'aide de la fonction PIVOT, mais puisque vous voulez faire pivoter plusieurs colonnes, vous devriez d'abord envisager de ne pas pivoter votre First et Last Colonnes.

Le processus unpivot convertira vos multiples colonnes en plusieurs lignes de données. Vous n'avez pas spécifié la version de SQL Server que vous utilisez mais vous pouvez utiliser un SELECT avec UNION ALL avec CROSS APPLY ou encore le UNPIVOT fonction pour effectuer la première conversion :

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

Voir SQL Fiddle avec démo . Cela convertit vos données au format :

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

Une fois que les données sont sur plusieurs lignes, vous pouvez facilement appliquer la fonction 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;

Voir SQL Fiddle avec démo

Les deux donnent un résultat de :

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