【问题标题】:Replace row values with column headers in SQL Server用 SQL Server 中的列标题替换行值
【发布时间】:2021-02-11 12:12:00
【问题描述】:

我有一个特定的数据集,该数据集已在 SQL 中进行了透视。现在我想用列标题名称替换行值,这太动态了。

初始表

StudentID Response QuestionID
S1 TRUE Question2
S1 TRUE Question3
S2 TRUE Question1
S2 TRUE Question2
S2 TRUE ..QuestionN

透视后的表格-

StudentID Question1 Question2 Question3 ..QuestionN
S1 NULL TRUE TRUE NULL
S2 TRUE TRUE NULL TRUE

预期输出

StudentID Question1 Question2 Question3 ..QuestionN
S1 NULL Question2 Question3 NULL
S2 Question1 Question2 NULL QuestionN

我使用下面的代码在“初始表”中的“枢轴后表”中进行枢轴。

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

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.TopicId) 
            FROM test c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT StudentId, ' + @cols + ' from 
            (
                select StudentId
                    , Response
                    , TopicId
                from test where Response = ''TRUE''
           ) x
            pivot 
            (
                 max(Response)
                for TopicId in (' + @cols + ')
            ) p '


execute(@query)

那么我可以在现有查询中进行更改或在现有查询中进行新的吗?

【问题讨论】:

  • 如果想继续您现有的查询,只需将max(Response) 更改为max(TopicId)

标签: sql-server pivot


【解决方案1】:

您将无法使用您使用的方法执行此操作。这只是我不喜欢创建列的分隔列表并注入它的方法的一个原因;它真的限制了你。

相反,将您需要的表达式注入到查询中,不要创建分隔列表,您就可以实现您所追求的。我也不再使用限制性更强的 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;

这是未经测试的,因为降价表在复制和粘贴时翻译得不好,并且没有 DDL 和 DML,但是,如果我可能犯了任何印刷错误,你最好的朋友会帮助你。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2016-11-25
  • 2019-11-30
相关资源
最近更新 更多