Untuk mendapatkan hasil yang Anda inginkan, Anda harus terlebih dahulu UNPIVOT
data dan kemudian PIVOT the
Nilai DatePeriod`.
UNPIVOT akan mengubah beberapa kolom Transactions
, Customers
dan Visits
menjadi beberapa baris. Jawaban lainnya menggunakan UNION ALL
untuk unpivot tetapi SQL Server 2005 adalah tahun pertama UNPIVOT
fungsi didukung.
Kueri untuk melepaskan data adalah:
select dateperiod,
col, value
from transactions
unpivot
(
value for col in (Transactions, Customers, Visits)
) u
Lihat Demo . Ini mengubah kolom Anda saat ini menjadi beberapa baris, sehingga datanya terlihat seperti berikut:
| DATEPERIOD | COL | VALUE |
-------------------------------------
| Jan 2012 | Transactions | 100 |
| Jan 2012 | Customers | 50 |
| Jan 2012 | Visits | 150 |
| Feb 2012 | Transactions | 200 |
Sekarang, karena data dalam baris, Anda dapat menerapkan PIVOT the
fungsi ke DatePeriod
kolom:
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;
Lihat SQL Fiddle dengan Demo .
Jika Anda memiliki jumlah periode tanggal yang tidak diketahui maka Anda akan menggunakan SQL dinamis:
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)
Lihat SQL Fiddle dengan Demo . Keduanya akan memberikan hasil:
| COL | JAN 2012 | FEB 2012 | MAR 2012 |
-------------------------------------------------
| Transactions | 100 | 200 | 300 |
| Customers | 50 | 100 | 200 |
| Visits | 150 | 300 | 600 |