听起来您想取消数据透视。根据您的 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 和 VALUES 将数据从列转换为行:
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 和 Question2 是不同的数据类型,那么您需要在 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;