Để có được kết quả mà bạn muốn, trước tiên bạn cần UNPIVOT
dữ liệu và sau đó PIVOT the
Giá trị của DatePeriod.
UNPIVOT sẽ biến đổi nhiều cột của Transactions
, Customers
và Visits
thành nhiều hàng. Các câu trả lời khác đang sử dụng UNION ALL
để giải nén nhưng SQL Server 2005 là năm đầu tiên UNPIVOT
chức năng đã được hỗ trợ.
Truy vấn để bỏ chia dữ liệu là:
select dateperiod,
col, value
from transactions
unpivot
(
value for col in (Transactions, Customers, Visits)
) u
Xem Demo . Điều này biến các cột hiện tại của bạn thành nhiều hàng, vì vậy dữ liệu trông giống như sau:
| DATEPERIOD | COL | VALUE |
-------------------------------------
| Jan 2012 | Transactions | 100 |
| Jan 2012 | Customers | 50 |
| Jan 2012 | Visits | 150 |
| Feb 2012 | Transactions | 200 |
Bây giờ, vì dữ liệu nằm trong hàng, bạn có thể áp dụng PIVOT
chức năng của DatePeriod
cột:
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;
Xem SQL Fiddle with Demo .
Nếu bạn có một số khoảng thời gian ngày không xác định thì bạn sẽ sử dụng SQL động:
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)
Xem SQL Fiddle với Demo . Cả hai sẽ cho kết quả:
| COL | JAN 2012 | FEB 2012 | MAR 2012 |
-------------------------------------------------
| Transactions | 100 | 200 | 300 |
| Customers | 50 | 100 | 200 |
| Visits | 150 | 300 | 600 |