Има няколко начина, по които можете да трансформирате данните от редове в колони.
Тъй като използвате SQL Server 2008, можете да използвате функцията PIVOT.
Предлагам да използвате row_number()
функция за подпомагане на обръщането на данните. Ако имате известен брой стойности, тогава можете да кодирате твърдо заявката:
изберете потребител, категория1, категория2, категория3, категория4от( изберете [потребител], категория, 'Категория'+cast(row_number() over(дял по [потребител] ред по [потребител]) като varchar(3 )) rn от yt) dpivot( max(category) за rn в (category1, category2, category3, category4)) piv;
Вижте SQL Fiddle с демонстрация .
За вашата ситуация заявихте, че ще имате неизвестен брой стойности, които трябва да бъдат колони. В такъв случай ще искате да използвате динамичен SQL, за да генерирате низа на заявката за изпълнение:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)select @cols =STUFF((SELECT distinct ',' + QUOTENAME('Category'+cast(row_number() over(partition by [потребител] ред по [потребител]) като varchar(3))) от yt FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query ='SELECT [user],' + @cols + ' from ( select [user], category, ''Category''+cast(row_number() over(partition by [user] order by [user]) като varchar(3)) rn от yt) d pivot ( max(category) for rn in (' + @cols + ') ) p 'execute(@query)
Вижте SQL Fiddle с демонстрация . И двете дават резултат:
<предварителен код>| ПОТРЕБИТЕЛ | КАТЕГОРИЯ1 | КАТЕГОРИЯ2 | КАТЕГОРИЯ3 | КАТЕГОРИЯ4 |------------------------------------------------ ----------| Брус | Лаптоп | Бира | (нула) | (нула) || Чък | Мобилен телефон | (нула) | (нула) | (нула) || Джак | Обувки | Вратовръзка | Стъкло | (нула) || Пеги | Обувка | Пола | прилеп | Котка |