在动态数据透视表中多次指定列

时间:2014-12-02 04:57:13

标签: sql-server sql-server-2008-r2 pivot

我有下表,里面有一些记录。

示例

:ffortest

create table ffortest
(
col1 int,
col2 int
)

插入记录

insert into ffortest values(1,2);
insert into ffortest values(3,4);
insert into ffortest values(5,6);
insert into ffortest values(7,8);
insert into ffortest values(9,2);
insert into ffortest values(1,2);

数据透视表查询

DECLARE @StuffColumn varchar(max)
DECLARE @sql varchar(max)

SELECT @StuffColumn = STUFF((SELECT ','+QUOTENAME(col1)
                        FROM ffortest
          FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')
PRINT(@StuffColumn)        

SET @SQL = ' select col2,'+ @StuffColumn +'
         from
         (
            select   col1,col2
            from ffortest
         )x
         pivot
         (
             count(col1)
             for col1 in( '+@StuffColumn +')
         )p'
PRINT(@SQL)
EXEC(@SQL)  

错误:列' 1'在p。

中指定了多个时间

预期结果

col2  1  9  3  5  7
-------------------
2     2  1  0  0  0
4     0  0  1  0  0
6     0  0  0  1  0
8     0  0  0  0  1

1 个答案:

答案 0 :(得分:1)

生成列列表时使用distinct来避免此错误。因为您不能在Pivot中多次使用相同的列,如

    pivot
     (
         count(col1)
         for col1 in ([1],[3],[5],[7],[9],[1])
     )p'

所以改变你的 @StuffColumn

SELECT @StuffColumn = STUFF((SELECT distinct ','+QUOTENAME(col1)
                        FROM ffortest
          FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')