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

Завъртете динамични колони, без агрегиране

Да, можете да извършите динамично завъртане. Понякога е по-лесно да се работи с PIVOT заявка, използвайки първо статична версия, за да можете да видите как ще изглеждат заявката и резултатите. След това преобразувайте заявката в динамична версия.

Ето пример за статична срещу динамична версия на заявка:

Статичен (SQL Fiddle ):

select *
from 
(
    select u.userid,
        u.fname,
        u.lname,
        u.mobile,
        r.question,
        r.choice
    from users u
    left join results r
        on u.questionid = r.questionid
        and u.choiceid = r.choiceid
) x
pivot
(
    min(choice)
    for question in([are you], [from])
) p

Динамичен (SQL Fiddle ):

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.question) 
            FROM results c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT userid, fname, lname, mobile, ' + @cols + ' from 
            (
                select u.userid,
                    u.fname,
                    u.lname,
                    u.mobile,
                    r.question,
                    r.choice
                from users u
                left join results r
                    on u.questionid = r.questionid
                    and u.choiceid = r.choiceid
           ) x
            pivot 
            (
                min(choice)
                for question in (' + @cols + ')
            ) p '


execute(@query)

Ако можете да предоставите повече подробности около текущата структура на таблицата и след това някои примерни данни. Трябва да сме в състояние да ви помогнем да създадете версията, която ще ви е необходима за вашата ситуация.

Както казах обаче, понякога е по-лесно да започнете със статична версия, където кодирате твърдо в колоните, които първо трябва да трансформирате, след което преминавате към динамичната версия.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sp_executesql, което кара моята заявка да бъде много бавна

  2. INSTR() Еквивалент в SQL Server

  3. Грешка - препълване на SqlDateTime. Трябва да е между 1/1/1753 00:00:00 AM и 12/31/9999 23:59:59 PM

  4. как да видя/скрипт дефиниции на системни изгледи?

  5. Ефективен начин за четене на BLOB данни в C#/SQL 2005