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

Преобразувайте редовете в колони с помощта на „Pivot“ в SQL Server

Ако използвате SQL Server 2005+, тогава можете да използвате PIVOT функция за трансформиране на данните от редове в колони.

Изглежда, че ще трябва да използвате динамичен sql, ако седмиците са неизвестни, но е по-лесно да видите правилния код, като използвате твърдо кодирана версия първоначално.

Първо, ето някои бързи дефиниции на таблици и данни за използване:

СЪЗДАВАНЕ НА ТАБЛИЦА yt ( [Store] int, [Week] int, [xCount] int); INSERT INTO yt( [Магазин], [Седмица], [xCount])СТОЙНОСТИ (102, 1, 96), (101, 1, 138), (105, 1, 37), (109, 1, 59), ( 101, 2, 282), (102, 2, 212), (105, 2, 78), (109, 2, 97), (105, 3, 60), (102, 3, 123), (101, 3, 220), (109, 3, 87); 

Ако вашите стойности са известни, тогава ще кодирате заявката:

изберете *от ( изберете магазин, седмица, xCount от yt ) srcpivot( sum(xcount) за седмица в ([1], [2], [3])) piv; 

Вижте демонстрация на SQL

След това, ако трябва да генерирате динамично номера на седмицата, вашият код ще бъде:

ДЕКЛАРИРАЙТЕ @cols КАТО NVARCHAR(MAX), @query КАТО NVARCHAR(MAX)изберете @cols =STUFF((SELECT ',' + QUOTENAME(седмица) от yt група по седмица подреждане по седмица ЗА XML PATH( ''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='ИЗБЕРЕТЕ магазин,' + @cols + ' от ( изберете магазин, седмица, xCount от yt ) x pivot ( sum(xCount) за седмица в (' + @cols + ') ) p 'execute(@query); 

Вижте демонстрация на SQL.

Динамичната версия генерира списък на седмица числа, които трябва да се преобразуват в колони. И двете дават един и същ резултат:

<предварителен код>| МАГАЗИН | 1 | 2 | 3 |-----------------------------------| 101 | 138 | 282 | 220 || 102 | 96 | 212 | 123 || 105 | 37 | 78 | 60 || 109 | 59 | 97 | 87 |

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server:динамично завъртане на 5 колони

  2. Добавете стойност по подразбиране на полето за дата и час в SQL Server към времева марка

  3. Задайте публичен профил по подразбиране за поща от база данни (SSMS)

  4. Създаване на тригери за одит в SQL Server

  5. Как да редактирам таблица, за да активирам CASCADE DELETE?