За да получите резултата, който искате, трябва първо да UNPIVOT
данните и след това PIVOT
DatePeriod` Стойности.
UNPIVOT ще трансформира множеството колони на Transactions
, Клиенти
и Посещения
на множество редове. Другите отговори използват UNION ALL
за отмяна на завъртане, но SQL Server 2005 беше първата година UNPIVOT
функцията се поддържа.
Заявката за деактивиране на данните е:
изберете dateperiod, col, valuefrom transactionsunpivot( стойност за col in (Transactions, Customers, Visits)) u
Вижте Демо . Това трансформира текущите ви колони в множество редове, така че данните изглеждат по следния начин:
<предварителен код>| ДАТА ПЕРИОД | COL | СТОЙНОСТ |------------------------------------------| януари 2012 | Транзакции | 100 || януари 2012 | Клиенти | 50 || януари 2012 | Посещения | 150 || февруари 2012 | Транзакции | 200 |
Сега, тъй като данните са в редове, можете да приложите PIVOT
функция към DatePeriod
колона:
изберете колона, [януари 2012], [февруари 2012], [мар 2012]from( изберете dateperiod, t.col, value, c.SortOrder from ( изберете dateperiod, col, стойност от транзакции unpivot ( стойност за колона в (Транзакции, Клиенти, Посещения) ) u ) t вътрешно обединяване ( изберете колона „Транзакции“, 1 съюз SortOrder всички изберете колона „Клиенти“, 2 съюз SortOrder всички изберете колона „Посещения“, 3 SortOrder ) c on t. col =c.col) dpivot( сума(стойност) за dateperiod в ([януари 2012], [февруари 2012], [мар 2012])) pivorder от SortOrder;
Вижте SQL Fiddle с демонстрация .
Ако имате неизвестен брой периоди от дата, тогава ще използвате динамичен 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 ( изберете 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 изберете колона ''Клиенти'', 2 SortOrder съюз всички изберете ''Посещения'' col, 3 SortOrder ) c on t.col =c.col ) x pivot ( sum(value) for dateperiod in (' + @cols + ') ) p order by SortOrder'execute(@ заявка)
Вижте SQL Fiddle с демонстрация . И двете ще дадат резултата:
<предварителен код>| COL | ЯНУАРИ 2012 | ФЕВРУАРИ 2012 | МАР 2012 г. |------------------------------------------------- --| Транзакции | 100 | 200 | 300 || Клиенти | 50 | 100 | 200 || Посещения | 150 | 300 | 600 |