Um das gewünschte Ergebnis zu erhalten, müssen Sie zuerst UNPIVOT
ausführen die Daten und dann PIVOT the
DatePeriod`-Werte.
Das UNPIVOT transformiert die mehreren Spalten von Transactions
, Customers
und Visits
in mehrere Reihen. Die anderen Antworten verwenden ein UNION ALL
zu unpivot, aber SQL Server 2005 war das erste Jahr des UNPIVOT
Funktion wurde unterstützt.
Die Abfrage zum Entpivotieren der Daten lautet:
select dateperiod,
col, value
from transactions
unpivot
(
value for col in (Transactions, Customers, Visits)
) u
Siehe Demo . Dadurch werden Ihre aktuellen Spalten in mehrere Zeilen umgewandelt, sodass die Daten wie folgt aussehen:
| DATEPERIOD | COL | VALUE |
-------------------------------------
| Jan 2012 | Transactions | 100 |
| Jan 2012 | Customers | 50 |
| Jan 2012 | Visits | 150 |
| Feb 2012 | Transactions | 200 |
Da sich die Daten nun in Zeilen befinden, können Sie den PIVOT
anwenden Funktion zu DatePeriod
Spalte:
select col, [Jan 2012], [Feb 2012], [Mar 2012]
from
(
select dateperiod,
t.col, value, c.SortOrder
from
(
select dateperiod,
col, value
from transactions
unpivot
(
value for col in (Transactions, Customers, Visits)
) u
) t
inner join
(
select 'Transactions' col, 1 SortOrder
union all
select 'Customers' col, 2 SortOrder
union all
select 'Visits' col, 3 SortOrder
) c
on t.col = c.col
) d
pivot
(
sum(value)
for dateperiod in ([Jan 2012], [Feb 2012], [Mar 2012])
) piv
order by SortOrder;
Siehe SQL-Geige mit Demo .
Wenn Sie eine unbekannte Anzahl von Datumsperioden haben, verwenden Sie dynamisches SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(dateperiod)
from transactions
group by dateperiod, PeriodNumberOverall
order by PeriodNumberOverall
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT col, ' + @cols + '
from
(
select dateperiod,
t.col, value, c.SortOrder
from
(
select dateperiod,
col, value
from transactions
unpivot
(
value for col in (Transactions, Customers, Visits)
) u
) t
inner join
(
select ''Transactions'' col, 1 SortOrder
union all
select ''Customers'' col, 2 SortOrder
union all
select ''Visits'' col, 3 SortOrder
) c
on t.col = c.col
) x
pivot
(
sum(value)
for dateperiod in (' + @cols + ')
) p
order by SortOrder'
execute(@query)
Siehe SQL Fiddle mit Demo . Beide liefern das Ergebnis:
| COL | JAN 2012 | FEB 2012 | MAR 2012 |
-------------------------------------------------
| Transactions | 100 | 200 | 300 |
| Customers | 50 | 100 | 200 |
| Visits | 150 | 300 | 600 |