我在Sql Server中有一个名为“ITEMS_PRICE
”的视图。
其中一些列是“Name
”列和“FormulaResult_Cost
”列。
我要做的是使用动态数据透视,将“Name
”字段的所有行设为列,并将值设为值FormulaResult_Cost
'。
这是我的SQL查询:
DECLARE @query NVARCHAR(4000)
DECLARE @cols NVARCHAR(4000)
SELECT @cols = STUFF((SELECT distinct '' + QUOTENAME(p.Name)
from ITEMS_PRICE AS p
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') ,1,0,'')
--select STUFF(@cols, 1,0,'')
set @query = 'SELECT p.ItemCode, p.ItemName, p.ItmsGrpCod, p.ItmsGrpNam, p.Name, p.FormulaResult_Cost, ' + @cols + '
from
ITEMS_PRICE as p
pivot
(
max(p.FormulaResult_Cost)
for p.Name in (' + '[' @cols + ']' + ')
) AS t'
EXECUTE(@query)
我得到的错误是:
Msg 102,Level 15,State 1,Line 29'@cols'附近的语法不正确。
另外,我不希望动态数据透视具有任何聚合函数。我刚刚在一些您必须使用的论坛中阅读,至少max()
函数才能更正for ... in
代码。
答案 0 :(得分:1)
您在此行+
之前错过了@cols
:for p.Name in (' + '[' @cols + ']' + ')
应为for p.Name in (' + '[' + @cols + ']' + ')
。
但是我不相信你需要额外的方括号,因为QUOTENAME
方法会添加它们,所以它应该是:
for p.Name in (' + @cols + ')
此外,如果您正在执行for p.Name in (@cols)
,则您的STUFF
函数应返回以逗号分隔的值,因此我会更新您的声明,以便在distinct
之后包含逗号:
SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME(p.Name)
from ITEMS_PRICE AS p
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') ,1,0,'')
完整查询:
DECLARE @query NVARCHAR(4000)
DECLARE @cols NVARCHAR(4000)
SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME(p.Name)
from ITEMS_PRICE AS p
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') ,1,0,'')
--select STUFF(@cols, 1,0,'')
set @query = 'SELECT p.ItemCode, p.ItemName, p.ItmsGrpCod, p.ItmsGrpNam,
p.Name, p.FormulaResult_Cost, ' + @cols + '
from
ITEMS_PRICE as p
pivot
(
max(p.FormulaResult_Cost)
for p.Name in (' + @cols + ')
) AS t'
EXECUTE(@query)
答案 1 :(得分:-1)
在+
之前添加@cols
。 ('[' @cols + ']'
)
set @query = 'SELECT p.ItemCode, p.ItemName, p.ItmsGrpCod,
p.ItmsGrpNam, p.Name, p.FormulaResult_Cost, ' + @cols + '
FROM
ITEMS_PRICE as p
pivot
(
max(p.FormulaResult_Cost)
for p.Name in (''' + @cols + ''')
) AS t'