Опитвате се да PIVOTкод>
данните. SQL сървърът има PIVOT
функция, която може да извърши това вместо вас. За да изпълните PIVOT
трябва да решите каква агрегатна функция да използвате. В моя пример използвах MAX()
но можете да използвате SUM()
и т.н.
Ако нямате обобщена функция, тогава можете да използвате обобщена функция с CASE
декларация за това.
Агрегирана/CASE версия: Тази версия изисква да кодирате твърдо всички имена в колоните.
изберете max(case when name ='Engineering' then rating end) Engineering, max(case when name ='Financials' then rating end) Финанси, max(case when name ='Scope' then rating end) Обхват, макс. (случай, когато име ='График', след това край на оценката) График, макс. (случай, когато име ='Рискове', след това край на оценката) Рискове, макс. (случай, когато име ='Хора', след това край на оценката) Хората от вашата таблица
Вижте SQL Fiddle с демонстрация
Статична PIVOT версия: Ще кодирате твърдо стойностите на имената в тази заявка
select *from( изберете име, рейтинг от вашата таблица) srcpivot( max(рейтинг) за име в ([Инженерство], [Финанси], [Обхват], [График], [Рискове], [Хора] )) piv
Вижте SQL Fiddle с демонстрация
Горните версии работят чудесно, ако имате известен брой колони, но ако вашето име
стойностите са неизвестни, тогава можете да използвате динамичен sql за PIVOT
данните.
Версия на Dynamic PIVOT:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)select @cols =STUFF((SELECT distinct ',' + QUOTENAME(Name) from yourtable FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='SELECT ' + @cols + ' from ( изберете име, рейтинг от вашата таблица ) x pivot ( max(рейтинг ) за име в (' + @cols + ') ) p 'execute(@query)
Вижте SQL Fiddle с демонстрация
И трите версии ще дадат един и същ резултат:
<предварителен код>| ИНЖЕНЕРИНГ | ФИНАНСИ | ОБХВАТ | ГРАФИК | РИСКОВЕ | ХОРА |------------------------------------------------ ----------------| 1 | 3 | 1 | 2 | 3 | 3 |