Похоже, что вы хотите UNPIVOT данных. Существует несколько способов сделать это в зависимости от вашей версии SQL Server.
Если вы используете SQL Server 2005+, вы можете использовать функцию UNPIVOT, преобразующий столбцы в строки:
select userid, questionid, answer
from yourtable
unpivot
(
answer
for questionId in (QuestionId1, QuestionId2)
) unpiv;
Если вы используете SQL Server 2008+, то вы можете использовать функцию UNPIVOT но вы можете также использовать CROSS APPLY и ЦЕННОСТИ, чтобы преобразовать данные из столбцов в строки:
select t.userid, c.questionid, c.answer
from yourtable t
cross apply
(
values
('QuestionId1', QuestionId1),
('QuestionId2', QuestionId2),
...
) c (questionId, answer);
Тогда, если у вас есть неизвестное количество столбцов, которые нужно преобразовать в строки, то вы можете использовать динамический SQL, чтобы получить результат:
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @colsUnpivot = stuff((select ','+quotename(C.name)
from sys.columns as C
where C.object_id = object_id('yourtable') and
C.name != 'userid'
for xml path('')), 1, 1, '')
set @query
= 'select userid, questionid, answer
from yourtable
unpivot
(
answer
for questionid in ('+ @colsunpivot +')
) u'
exec(@query);
В качестве побочного примечания, когда вы выполняете этот тип преобразования, данные столбцов, преобразованных в строки, должны быть одного и того же типа данных. Например, если Question1 и Вопрос2 были разные типы данных, то вам нужно будет конвертировать их до до UNPIVOT похожее на это:
select userid, questionid, answer
from
(
select userid,
cast(questionid1 as varchar(10)) questionid1,
cast(questionid2 as varchar(10)) questionid2
from yourtable
) src
unpivot
(
answer
for questionId in (QuestionId1, QuestionId2)
) unpiv;
вы пробовали писать его в качестве шарнирного запроса еще? – Limey
Вы упомянули об импорте ответов; вы уже это сделали? Если нет, почему бы не перенести данные перед загрузкой в базу данных. Это легко сделать с чем-то вроде Excel. – BellevueBob
Вплоть до этого момента, это то, что я делал, но есть так много пользователей, что потребовалось бы навсегда, чтобы назначить идентификатор пользователя обратно на ответы. Я искал способ сделать это с помощью сводных таблиц, но пока не могу обойти структуру иерархии. – user2187945