【问题标题】:Column specified multiple times in dynamic pivot table在动态数据透视表中多次指定的列
【发布时间】:2014-12-02 04:57:13
【问题描述】:

我有下表,其中包含一些记录。

示例

表格:最有效

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)  

错误:在 p 中多次指定了列 '1'。

预期结果是

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

【问题讨论】:

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


    【解决方案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,'')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多