将PIVOT转换为SQL Server

3

我有一个包含以下列的表格:

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)

出现错误:

语法不正确,附近有逗号


2
错误是否发生在 EXECUTE 行上?假设是的话,像这样进行动态查询生成时,在执行之前打印查询通常是很有用的。在执行之前,@query 包含什么内容? - Daniel Renshaw
但我希望只返回一个表格并通过编程进行展示。谢谢您的一切。 - Antony
如果您添加了一个 PRINT 语句并在 Management Studio 中执行它,您应该会看到查询结果打印到输出窗口。 - Daniel Renshaw
2个回答

2
试试这个 -
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

另外,我该如何添加一个名为“总计”的列,它是动态字段的总和? - Antony

1

有几个小的语法错误。首先,在 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

的意思是保留 HTML 格式,其中包含一个链接,链接名称为 "SQL FIDDLE"。

+1. 差一点就成功了...通过比较 这里的查询 找到了错误。但你是第一个发现它的人。 - Prahalad Gaggar
谢谢,没问题。但是当你保存视图时,会出现错误:' DECLARE' 附近的语法不正确。 - Antony
你不能在视图中进行声明。或者说,也不能使用多个查询。如果你想要它成为一个视图,你必须完全不同地布局它。 - Kenneth Fisher
另外,我该如何添加一个名为“总计”的列,它是动态字段的总和? - Antony

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