Требуется свод для структурированных данных ниже

#sql #sql-server #sql-server-2012 #sql-server-2017

#sql #sql-сервер #sql-server-2012 #sql-server-2017

Вопрос:

у меня есть данные в формате ниже.

 ID   question    answer
1    who         A
1    where       B
1    when        C
1    how         D
  

мне требовался вывод, как показано ниже

 id   who   where   when   how
1    A     B       C      D
  

Комментарии:

1. Вы можете проверить и принять мой ответ, если он вам помог.

Ответ №1:

Вы можете попробовать это с помощью динамического сводного запроса.

 create table #temp (ID int, question varchar(20), answer char(1))
insert into #temp values
(1,    'who',         'A'),
(1,    'where',       'B'),
(1,    'when',        'C'),
(1,    'how',         'D')

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

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

set @query = 'SELECT Id, '   @cols   ' from 
            (
                select Id
                    ,question
                    , answer
                from #temp
           ) x
            pivot 
            (
                 max(answer)
                for question in ('   @cols   ')
            ) p '


execute(@query)
  

Живая демонстрация

Комментарии:

1. Привет, Сурадж, Этот запрос работает для этого примера, но у меня много записей для одного идентификатора, в этом случае я получаю сообщение об ошибке ниже. Количество элементов в списке выбора превышает максимально допустимое количество в 4096 элементов.

2. Я думаю, что в этом случае вам нужно предоставить некоторое условие фильтра для ограничения записей.

Ответ №2:

используйте условную агрегацию

   select id, 
  max(case when question='who' then answer end) as "who",
  max(case when question='where' then answer end) as "where",
  max(case when question='when' then answer end) as "when",
  max(case when question='how' then answer end) as "how"
   from table_name
  group by id
  

Комментарии:

1. у меня так много вопросов по одному идентификатору, то есть более 1000. Как я могу динамически получать имена столбцов?

2. Используйте для всех вопросов этот процесс или измените структуру вашей БД

3. @SurajKumar хахах, я пропустил двойной вопрос, спасибо, но за это вы проголосовали против, я думаю, вы удалите сейчас

4. @ZaynulAbadinTuhin удалил голосование «Даун».

Ответ №3:

Вы можете попробовать это.

     DECLARE @column AS VARCHAR(MAX), @query  AS VARCHAR(MAX);

    SET @column = STUFF((SELECT distinct ','   QUOTENAME(t.question) FROM table t FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),1,1,'')

    set @query = 'SELECT Id, '   @column   ' from 
                (
                    select Id, question, answer from table
                ) x
                pivot 
                ( max(answer) for question in ('   @column   ')
                ) p '


    exec (@query)