Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server - PIVOT - zwei Spalten in Zeilen

Es gibt verschiedene Möglichkeiten, wie Sie das gewünschte Ergebnis erzielen können. Ähnlich wie @Sheela K R's Antwort Sie können eine Aggregatfunktion mit einem CASE-Ausdruck verwenden, aber sie kann kürzer geschrieben werden:

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;

Siehe SQL-Fiddle mit Demo .

Dies könnte auch mit der PIVOT-Funktion geschrieben werden, da Sie jedoch mehrere Spalten pivotieren möchten, sollten Sie sich zuerst das Unpivoting Ihres First ansehen und Last Säulen.

Der Unpivot-Prozess konvertiert Ihre mehreren Spalten in mehrere Datenzeilen. Sie haben nicht angegeben, welche Version von SQL Server Sie verwenden, aber Sie können ein SELECT verwenden mit UNION ALL mit CROSS APPLY oder sogar das UNPIVOT Funktion, um die erste Konvertierung durchzuführen:

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

Siehe SQL Fiddle mit Demo . Dadurch werden Ihre Daten in das Format:

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

Sobald sich die Daten in mehreren Zeilen befinden, können Sie die PIVOT-Funktion ganz einfach anwenden:

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;

Siehe SQL Fiddle mit Demo

Beide geben ein Ergebnis von:

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