我有一个特定的数据集,它已经在SQL中进行了pivot。现在我想用列标题名替换行值,这太动态了。
初始表
StudentID | Response | QuestionID | S1 | 对 | 问题2 | S1
---|---|---|
对 | 问题3 | |
S2 | 对 | 问题1 |
S2 | 对 | 问题2 |
S2 | 对 | . . QuestionN |
您将无法使用您使用的方法做到这一点。这只是我不喜欢创建带分隔符的列列表并注入它的一个原因;它真的限制了你。
相反,将需要的表达式注入到查询中,而不是创建分隔的列表,这样就可以实现您想要的结果。我也远离了更严格的PIVOT
操作符,并且还使用sys.sp_executesql
,因为您不能参数化您的查询(如果将来需要的话)。
DECLARE @SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) + NCHAR(10);
SET @SQL = N'SELECT StudentID,' + @CRLF +
STUFF((SELECT N',' + @CRLF +
N' MAX(CASE WHEN QuestionID = ' + QUOTENAME(YT.QuestionID,'''') + N' AND Response = ''TRUE'' THEN ' + QUOTENAME(YT.QuestionID,'''') + N' END) AS ' + QUOTENAME(YT.QuestionID)
FROM dbo.YourTable YT
GROUP BY YT.QuestionID
ORDER BY YT.QuestionID
FOR XML PATH(N''),TYPE).value('(./text())[1]','nvarchar(MAX)'),1,3,N'') + @CRLF +
N'FROM dbo.YourTable' + @CRLF +
N'GROUP BY StudentID' + @CRLF +
N'ORDER BY StudentID;';
--PRINT @SQL; --YOur Best Friend
EXEC sys.sp_executesql @SQL;
这是未经测试的,因为markdown表在复制和粘贴中不能很好地翻译,而且没有DDL和DML,但是,如果我犯了任何印刷错误,您最好的朋友将帮助您。