动态数据透视 - @cols附近的语法错误不正确

时间:2014-07-07 09:03:39

标签: sql-server dynamic-pivot

我在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代码。

2 个答案:

答案 0 :(得分:1)

您在此行+之前错过了@colsfor 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'
相关问题