【问题标题】:PIVOT into SQL Server透视到 SQL Server
【发布时间】:2013-05-30 15:35:59
【问题描述】:

我有一个带有列的表格:

Anno, Description, Number
________________________
2011    Example1     12
2013    Example2      9
2011    Example4      8

......

Description 列中的值是动态的

我必须生成如下表格:

Anno Example1 Example2 Example3 Example4 ........
--------------------------------------------------    
2011   12         0       0        8     ........
2012    0        23      24       36     ........
......

我创建了一个这样的视图:

Declare @cols AS NVARCHAR(Max),
        @query AS NVARCHAR(Max)

Select @cols = STUFF(( Select ','+QUOTENAME(Description)
                       FROM mytable
                       GROUP BY Description
                       Order by Description
                       FOR XML PATH ('',TYPE
                       ).value('.','NVARCHAR(Max)'),1,1,'')

SET @query= 'Select Anno, '+cols+' from
             (Select Anno, Description, Number
              FROM mytable ) as x
              PIVOT
              (
                SUM(Number)
                FOR Description in ('+cols+')
               ) pvt'

EXECUTE(@query)

它返回一个错误:

',' 附近的语法不正确

【问题讨论】:

  • 错误是否发生在EXECUTE 行?假设是这样,在进行这样的动态查询生成时,在执行查询之前PRINT 查询通常很有用。 @query 在执行之前包含什么?
  • 但我希望我只有一个表可以通过编程显示。所有人的坦克
  • 如果添加 PRINT 语句,然后在 Management Studio 中全部执行,您应该会看到查询打印到输出。

标签: sql-server


【解决方案1】:

试试这个 -

DECLARE @query NVARCHAR(MAX)

SELECT @query = '
    SELECT Anno, ' + cols + ' 
    FROM (
        SELECT Anno, Description, Number
        FROM dbo.mytable 
    ) x
    PIVOT
    (
    SUM(Number) FOR [Description] IN (' + cols + ')
    ) pvt'
FROM (
    SELECT cols = STUFF((
        SELECT ', [' + [Description] + ']'
        FROM dbo.mytable d
        GROUP BY [Description]
        ORDER BY [Description]
        FOR XML PATH (''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
) t

EXEC sys.sp_executesql @query

【讨论】:

  • 另外,如何添加一个列“总计”,即动态字段的总和??
【解决方案2】:

几个小的语法错误。首先,您在FOR XML PATH 中缺少一个近括号。

FOR XML PATH ('',TYPE

变成

FOR XML PATH (''),TYPE

其次,您将列列表存储在变量中,而不是在动态 SQL 中将其作为变量引用。这可以正常工作。

Declare @cols AS NVARCHAR(Max),
        @query AS NVARCHAR(Max)

Select @cols = STUFF(( Select ','+QUOTENAME(Description)
                       FROM mytable
                       GROUP BY Description
                       Order by Description
                       FOR XML PATH (''),TYPE
                       ).value('.','NVARCHAR(Max)'),1,1,'')

SET @query= 'Select Anno, '+@cols+', Total from
             (Select Anno, Description, Number, 
                SUM(Number) OVER (PARTITION BY Anno) AS Total
              FROM mytable ) as x
              PIVOT
              (
                SUM(Number)
                FOR Description in ('+@cols+')
               ) pvt'

SQL FIDDLE

【讨论】:

  • +1。如此接近...通过比较 Query from here 弄错了,但你是第一个。
  • 坦克没关系但是当你保存视图时给我错误:' DECLARE 附近的语法不正确
  • 您不能在视图中进行声明。或与此相关的多个查询。如果你想让它成为一个视图,你将不得不完全不同地布局它。
  • 另外,如何添加一个列“总计”,即动态字段的总和??
猜你喜欢
  • 2015-10-26
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 2021-12-06
  • 2015-02-25
  • 2013-06-06
相关资源
最近更新 更多