Sql server 如何在Pivot中使用TSQL?

Sql server 如何在Pivot中使用TSQL?,sql-server,tsql,pivot,common-table-expression,Sql Server,Tsql,Pivot,Common Table Expression,我正在重写一个TSQL查询,该查询使用STUFF操作符以问题编号水平旋转求和的答案值。我声明了一个参数,并将其设置为使用上述运算符。但是,当我将参数放在pivot语句的IN部分时,我在@cols附近收到了不正确的语法 DECLARE @cols AS NVARCHAR(MAX) SELECT @cols = STUFF(( SELECT ',' + QUOTENAME(ColName) FROM ( SELECT

我正在重写一个TSQL查询,该查询使用STUFF操作符以问题编号水平旋转求和的答案值。我声明了一个参数,并将其设置为使用上述运算符。但是,当我将参数放在pivot语句的IN部分时,我在@cols附近收到了不正确的语法

DECLARE @cols AS NVARCHAR(MAX)

SELECT @cols = STUFF((
            SELECT ',' + QUOTENAME(ColName)
            FROM (
                SELECT DISTINCT CONVERT(VARCHAR(50), QuestionNumber) AS ColName
                FROM Questions
                WHERE StudyID = 23
                ) AS sub
            ORDER BY CONVERT(INT, ColName) ASC
            FOR XML PATH('')
                ,TYPE
            ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

WITH cteX
AS (
    SELECT q.StudyID
        ,r.RespID
        ,p.ProductNumber
        ,p.ProductSequence
        ,CONVERT(VARCHAR(50), s.DateAdded, 101) AS StudyDate
        ,CONVERT(VARCHAR(15), CAST((s.DateAdded) AS TIME), 100) AS StudyTime
        ,DATENAME(dw, s.DateAdded) AS [DayOfWeek]
        ,p.[A_Value]
        ,p.B_Value
        ,p.C_Value
        ,p.D_Value
        ,p.E_Value
        ,p.F_Value
        ,q.DependentVarYN
        ,q.VariableAttributeID
        ,v.VarAttributeName
        ,q.QuestionNumber
        ,q.BottomScaleAnchor
        ,q.BottomScaleValue
        ,q.TopScaleAnchor
        ,q.TopScaleValue
    FROM Questions q
    INNER JOIN Answers a ON q.QuestionID = a.QuestionID
    INNER JOIN Respondents r ON a.RespID = r.RespID
    INNER JOIN Products p ON a.StudyID = p.ProductID
    INNER JOIN Studies s ON q.StudyID = s.StudyID
    INNER JOIN VariableAttributesForQuestions v ON q.VariableAttributeID = v.VariableAttributeID
    )
--,
SELECT StudyID
    ,RespID
    ,ProductNumber
    ,ProductSequence
    ,StudyDate
    ,StudyTime
    ,[DayOfWeek]
    ,cteX.[A_Value] AS [A]
    ,cteX.[B_Value] AS B
    ,cteX.[C_Value] AS C
    ,cteX.[D_Value] AS D
    ,cteX.E_Value AS E
    ,cteX.F_Value AS F
    ,DependentVarYN
    ,VariableAttributeID
    ,VarAttributeName
    ,BottomScaleAnchor
    ,BottomScaleValue
    ,TopScaleAnchor
    ,TopScaleValue
FROM cteX
pivot(sum(AnswerValue) FOR cteX.QuestionNumber IN (@cols)) AS piv

如何优化查询,使数据透视表解析每个问题的AnswerValue和?

您不能创建这样的动态数据透视。您需要将T-SQL语句构建为字符串,然后执行它

DECLARE @cols AS NVARCHAR(MAX)

SELECT @cols = STUFF((
            SELECT ',' + QUOTENAME(ColName)
            FROM (
                SELECT DISTINCT CONVERT(VARCHAR(50), QuestionNumber) AS ColName
                FROM Questions
                WHERE StudyID = 23
                ) AS sub
            ORDER BY CONVERT(INT, ColName) ASC
            FOR XML PATH('')
                ,TYPE
            ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

DECLARE @DynamicTSQLStatement NVARCHAR(MAX) = N'


WITH cteX
AS (
    SELECT q.StudyID
        ,r.RespID
        ,p.ProductNumber
        ,p.ProductSequence
        ,CONVERT(VARCHAR(50), s.DateAdded, 101) AS StudyDate
        ,CONVERT(VARCHAR(15), CAST((s.DateAdded) AS TIME), 100) AS StudyTime
        ,DATENAME(dw, s.DateAdded) AS [DayOfWeek]
        ,p.[A_Value]
        ,p.B_Value
        ,p.C_Value
        ,p.D_Value
        ,p.E_Value
        ,p.F_Value
        ,q.DependentVarYN
        ,q.VariableAttributeID
        ,v.VarAttributeName
        ,q.QuestionNumber
        ,q.BottomScaleAnchor
        ,q.BottomScaleValue
        ,q.TopScaleAnchor
        ,q.TopScaleValue
    FROM Questions q
    INNER JOIN Answers a ON q.QuestionID = a.QuestionID
    INNER JOIN Respondents r ON a.RespID = r.RespID
    INNER JOIN Products p ON a.StudyID = p.ProductID
    INNER JOIN Studies s ON q.StudyID = s.StudyID
    INNER JOIN VariableAttributesForQuestions v ON q.VariableAttributeID = v.VariableAttributeID
    )
--,
SELECT StudyID
    ,RespID
    ,ProductNumber
    ,ProductSequence
    ,StudyDate
    ,StudyTime
    ,[DayOfWeek]
    ,cteX.[A_Value] AS [A]
    ,cteX.[B_Value] AS B
    ,cteX.[C_Value] AS C
    ,cteX.[D_Value] AS D
    ,cteX.E_Value AS E
    ,cteX.F_Value AS F
    ,DependentVarYN
    ,VariableAttributeID
    ,VarAttributeName
    ,BottomScaleAnchor
    ,BottomScaleValue
    ,TopScaleAnchor
    ,TopScaleValue
FROM cteX
pivot(sum(AnswerValue) FOR cteX.QuestionNumber IN (' + @cols + ')) AS piv';


exec sp_executesql @DynamicTSQLStatement;

可能重复的错误语法是在哪一行抱怨的?你应该学习你使用的工具背后的机制,而不是仅仅应用它们而不考虑它们。你知道
东西在这里实际做什么吗?它正在从字符串中删除前导逗号。就这样。通过滥用
FOR XML
功能来实现连接等。认为整个操作都是
东西
是严重错误地将执行此技巧的“功劳”归为“功劳”。