0

我在 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)


我得到的错误是:

消息 102,级别 15,状态 1,第 29 行 '@cols' 附近的语法不正确。


另外,我不希望动态枢轴具有任何聚合函数。我刚刚在一些您必须使用的论坛上阅读,至少max()功能是为了更正for ... in代码。

4

2 回答 2

1

您在此行缺少一个+before @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)
于 2014-07-07T09:13:36.187 回答
-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'
于 2014-07-07T09:13:39.957 回答