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

SQL Server 2012 PIVOT без агрегат

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

Агрегиране с 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 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли разлика между DateTime в C# и DateTime в SQL сървър?

  2. Възстановяване на SQL Server 2017

  3. Как да използвам 'LIKE' оператор с Unicode низове?

  4. Броят на редовете за несъответствие на SQL Server в заявка SELECT и UPDATE с еднакви условия

  5. Подреждане на родителските редове по низходяща дата с дъщерни редове, подредени независимо под всеки