Sql server 如何在Pivot中使用TSQL?
我正在重写一个TSQL查询,该查询使用STUFF操作符以问题编号水平旋转求和的答案值。我声明了一个参数,并将其设置为使用上述运算符。但是,当我将参数放在pivot语句的IN部分时,我在@cols附近收到了不正确的语法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
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
功能来实现连接等。认为整个操作都是东西
是严重错误地将执行此技巧的“功劳”归为“功劳”。