#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)