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

Транспониране на редове и колони без агрегат

Ако ще приложите PIVOT функция, ще трябва да използвате агрегатна функция, за да получите резултата, но също така ще искате да използвате функция за прозорец като row_number() за генериране на уникална последователност за всеки контакт в акаунта.

Първо, ще потърсите данните си подобно на:

изберете акаунт, контакт, 'contact' + cast(row_number() over(разделяне по акаунт, ред по контакт) като varchar(10)) seq от вашата таблица 

Вижте SQL Fiddle с демонстрация. Това ще създаде нова колона с уникалната последователност:

<предварителен код>| АКАУНТ | КОНТАКТ | SEQ ||--------|-----------|----------|| 1 | 324324324 | контакт1 || 1 | 674323234 | контакт2 |

Ако имате ограничен брой колони, тогава можете да кодирате заявката си:

изберете акаунт, contact1, contact2, contact3, contact4from (изберете акаунт, контакт, 'контакт' + cast(row_number() over(разделяне по акаунт, ред по контакт) като varchar(10)) seq от вашата таблица) dpivot( max(contact) за seq in (contact1, contact2, contact3, contact4)) piv; 

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

Ако имате неизвестен брой колони, тогава ще трябва да използвате динамичен SQL:

ДЕКЛАРИРАНЕ @cols КАТО NVARCHAR(MAX), @query КАТО NVARCHAR(MAX)изберете @cols =STUFF((SELECT ',' + QUOTENAME(seq) от ( изберете 'contact' + cast(row_number()) over(разделяне по ред на акаунт чрез контакт) като varchar(10)) seq от вашата таблица ) d група по seq ред по seq FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='ИЗБЕРЕТЕ акаунт, ' + @cols + ' от ( изберете акаунт, контакт, ''контакт'' + прехвърляне(row_number() над (разделяне по акаунт, ред по контакт) като varchar(10)) seq от вашата таблица ) x въртене ( макс (контакт) за seq in (' + @cols + ') ) p 'изпълни sp_executesql @query; 

Вижте SQL Fiddle с демонстрация. И двете ще ви дадат резултат от:

<предварителен код>| АКАУНТ | КОНТАКТ1 | КОНТАКТ2 | КОНТАКТ3 | КОНТАКТ4 ||---------|-----------|-----------|-----------|- ----------|| 1 | 324324324 | 674323234 | (нула) | (нула) || 2 | 433243443 | 833343432 | (нула) | (нула) || 3 | 787655455 | (нула) | (нула) | (нула) || 4 | 455435435 | 754327545 | (нула) | (нула) || 5 | 432432432 | 432433242 | 432455553 | 543544355 |

  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

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

  3. Таблица:Повторете редовете на заглавките на всяка страница, които не работят - Report Builder 3.0

  4. UNION резултатите от множество съхранени процедури

  5. Как можете да наименувате таблиците на набора от данни, които връщате в съхранена процедура?