Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Показване на колони като редове в SQL Server 2005

За да получите резултата, който искате, трябва първо да 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 |

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-Sql - Подреждане по буквено-цифрово

  2. CONTAINSTABLE заместващ знак е неуспешен при съвпадение по фраза?

  3. Оптимален начин за конвертиране към дата

  4. Как трябва да работи timestamp2 на SQL Server в JDBC?

  5. Генерирайте всички комбинации в SQL