Има няколко начина, по които можете да трансформирате данните. Някои използват агрегатна функция, а други не. Но въпреки че завъртате низ, все още можете да приложите агрегат.
Агрегиране с CASE:
изберете име, max (случай, когато категория ='A', след това 'X' else '' край) Категория A, max (случай, когато категория ='B', след това 'X' else '' край) Категория B, макс (случай, когато категория ='C', след това 'X' else '' край) КатегорияC, макс. (случай, когато категория ='D', след това 'X' else '' край) CategoryD от групата на вашата таблица по име
Вижте SQL Fiddle с демонстрация
Статична осова точка:
Все още можете да използвате PIVOT
функция за трансформиране на данните, въпреки че стойностите са низове. Ако имате известен брой категории, тогава можете да кодирате твърдо заявката:
изберете име, обединяване(A, '') КатегорияA, обединяване(B, '') КатегорияB, обединяване(C, '') КатегорияC, обединяване(C, '') CategoryDfrom( изберете име, категория, Флаг „X“ от вашата таблица) dpivot( max(флаг) за категория в (A, B, C, D)) piv
Вижте SQL Fiddle с демонстрация .
Динамична ос:
Ако имате неизвестен брой категории, тогава можете да използвате динамичен SQL:
DECLARE @cols КАТО NVARCHAR(MAX), @colsNull КАТО NVARCHAR(MAX), @query КАТО NVARCHAR(MAX)изберете @cols =STUFF((SELECT ',' + QUOTENAME(category) от групата на вашата таблица по категория подреждане по категория FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')select @colsNull =STUFF((SELECT ', coalesce(' + QUOTENAME(category)+', '''') като '+QUOTENAME('Category'+category) от вашата таблица група по категория подреждане по категория FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR (MAX)') ,1,1,'')set @query ='SELECT name, ' + @colsNull + ' from ( select name, category, ''X'' flag from yourtable ) x pivot ( max(flag) за категория в (' + @cols + ') ) p 'execute(@query)
Вижте SQL Fiddle с демонстрация .
Множество присъединявания:
изберете c1.name, случай, когато c1.category не е null, тогава 'X' else '' край като CategoryA, случай, когато c2.category не е null, тогава 'X' else '' край като CategoryB, case когато c3.category не е нула, тогава 'X' else '' завършва като CategoryC, случай, когато c4.category не е нула, тогава 'X' else '' завършва като CategoryD от вашата таблица c1left се присъединява към вашата таблица c2 на c1.name =c2.name и c2.category ='B'отляво да се присъедини към вашата таблица c3 към c1.name =c3.име и c3.category ='C'отляво да се присъедини към вашата таблица c4 към c1.name =c4.име и c4.category ='D'където c1. категория ='A'
Вижте SQL Fiddle с демонстрация
Всички заявки ще дадат резултат:
<предварителен код>| ИМЕ | КАТЕГОРИЯ | КАТЕГОРИЯB | КАТЕГОРИЯ | КАТЕГОРИЯ |------------------------------------------------ --------| Джо | X | X | | X || Мери | X | | X | X |