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

PIVOT динамично, върнати резултати от JOIN на две таблици

Може би пропускам нещо, но трябва да можете да PIVOT данните, но ще трябва да внедрите row_number() за да помогнете за генерирането на колоните.

Ключът ще бъде да използвате заявка, подобна на:

SELECT ONE.UserID, ONE.Episode, ONE.Value, TWO.Details, 'Details' +cast(row_number() over(partition by one.userid, one.episode order by two.details) като varchar(10)) seqFROM TABLE1 ONE INNER JOIN TABLE2 Two ON ONE.UserID =TWO.UserID AND ONE.Episode =TWO.Episode 

Това ще създаде уникална последователност за новите имена на колони, след което можете да приложите PIVOT:

изберете userid, episode, value, details1, details2from( SELECT ONE.UserID, ONE.Episode, ONE.Value, TWO.Details, 'Details' +cast(row_number() over(partition by one.userid , ред на един.епизод по two.details) като varchar(10)) seq FROM TABLE1 ONE INNER JOIN TABLE2 Two ON ONE.UserID =TWO.UserID AND ONE.Episode =TWO.Episode) dpivot( max(details) for seq in (Детайли1, Детайли2)) piv; 

Вижте SQL Fiddle с демонстрация . След това можете да конвертирате това в динамичен SQL:

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)select @cols =STUFF((SELECT ',' + QUOTENAME('Details'+cast(seq as varchar(10))) from ( select row_number() over(partition by one.userid, one.episode order by two.details) seq FROM TABLE1 ONE INNER JOIN TABLE2 Two ON ONE.UserID =TWO.UserID AND ONE.Episode =TWO.Episode ) d група по seq ред по seq FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='SELECT userid, episode, value, ' + @cols + ' from ( SELECT ONE.UserID, ONE.Episode, ONE.Value, TWO.Details, ''Details'' +cast (row_number() over(partition by one.userid, one.episode order by two.details) as varchar(10)) seq FROM TABLE1 ONE INNER JOIN TABLE2 Two ON ONE.UserID =TWO.UserID AND ONE.Episode =TWO. Episode ) x pivot ( max(details) for seq in (' + @cols + ') ) p 'execute sp_executesql @query; 

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

<предварителен код>| USERID | ЕПИЗОД | СТОЙНОСТ | ПОДРОБНОСТИ1 | ПОДРОБНОСТИ2 ||--------|---------|-----------|-----------|---- -------|| 1 | 1 | СТОЙНОСТ 1-1 | Подробности 1 | Детайли 2 || 1 | 2 | СТОЙНОСТ 1-2 | Подробности 1 | Подробности 2 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Свойството ConnectionString не е инициализирано грешка във VB.NET

  2. Как да стартирам задание на SQL Server от съхранена процедура?

  3. Създайте база данни на SQL Server с Azure Data Studio

  4. Използване на Excel VBA за изпълнение на SQL заявка

  5. t-sql select получава всички месеци в рамките на редица години