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

Sql server 在动态数据透视表中多次指定的列,sql-server,sql-server-2008-r2,pivot,Sql Server,Sql Server 2008 R2,Pivot,下表中有一些记录 示例: 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

下表中有一些记录

示例

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)  
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
表格: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)  
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
数据透视表查询

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)  
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”在p中指定了多次

预期结果为

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

生成列列表时,请使用
distinct
以避免此错误。因为不能在类似Pivot的中多次使用同一列

    pivot
     (
         count(col1)
         for col1 in ([1],[3],[5],[7],[9],[1])
     )p'
所以,像这样更改您的@stuff列

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