动态旋转 SQL Server 2012

3

我正在尝试在SQL Server 2012中运行我的第一个动态透视。

我用于动态透视的临时表#temp如下所示。

YearMonth   Agreement nr    Discount
------------------------------------
201303         123            1
201303          12            0
201304           1            0

我运行这段代码,但它不起作用:
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName = ISNULL(@ColumnName + ',', '') + QUOTENAME(YearMonth )
FROM (SELECT DISTINCT YearMonth FROM #FINAL) AS Courses

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
  N'SELECT [Agreement nr],YearMonth , ' + @ColumnName + '
    FROM #FINAL
    PIVOT(
            COUNT(agreement nr) 
          FOR YearMonth IN (' + @ColumnName + ') AS PVTTable'
--Execute the Dynamic Pivot Query

EXECUTE  @DynamicPivotQuery;

我收到的错误信息是:

'FOR YearMonth IN ([201403]) AS PVTTable'不是一个有效的标识符。

我错过了什么吗?
3个回答

1
错误的原因是在给Pivot取别名之前你缺少了一个括号。此外,你的Pivot相当低效。你应该在Pivot中选择源表需要的内容,否则它可能运行很长时间,并产生许多带有空返回值的行。以下是修复后的代码,希望更有效率:
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME(YearMonth )
FROM (SELECT DISTINCT YearMonth FROM #FINAL) AS Courses

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
  N'SELECT ' + @ColumnName + '
    FROM (Select [Agreement nr], YearMonth from #FINAL) src
    PIVOT(
            COUNT([Agreement nr]) 
          FOR YearMonth IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query

EXECUTE sp_executesql @DynamicPivotQuery;

我尝试了这个解决方案,但它抛出一个错误: COUNT(Agreement nr) FOR YearMonth IN ([201503],[201506],[201504],[201505])) AS PVTTable' 不是一个有效的标识符。这可能与我们需要进行COUNT而不包含YearMonth的GROUP BY有关,需要这样做吗? - user3197575
请尝试在方括号中也加入“协议编号”:[协议编号] - Christian Barron
有趣。我已经在它周围加上了括号,但它仍然抛出相同的错误:Msg 203,级别16,状态2,第20行 名称“SELECT [Agreement nr],YearMonth,[201503],[201506],[201504],[201505] FROM(选择[Agreement nr],YearMonth from #tester)src PIVOT( COUNT([Agreement nr]) FOR YearMonthIN ([201503],[201506],[201504],[201505])) AS PVTTable”不是有效的标识符。 - user3197575
你尝试过正常运行语句并在@ColumnName值中硬编码吗? - Christian Barron
好的,我搞清楚这里发生了什么。你需要使用sp_executesql来执行语句。在select语句中你也不能有Agreement nr或YearMonth,因为你正在将YearMonth转换为列,所以不能再把它变成行,而且你还在填充列的计数协议nr,所以它也不能是行。明白了吗?我已经更新了上面的代码以反映这一点。 - Christian Barron
谢谢Christian。我现在理解得更好了。 - user3197575

0

你缺少一个括号

SET @DynamicPivotQuery = 
  N'SELECT [Agreement nr],YearMonth , ' + @ColumnName + '
    FROM #FINAL
    PIVOT(
            COUNT([agreement nr]) 
          FOR YearMonth IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query

0

你忘记关闭逗号。

PIVOT(
        COUNT(Kundavtalid) 
        FOR YearMonth IN (' + @ColumnName + ') 
     ) AS PVTTable' -- here you miss pathernesis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接