在SQL SERVER中将PIVOT用于多个记录

时间:2014-04-16 10:46:47

标签: sql sql-server pivot multiple-columns

我正在使用以下查询

CREATE Table   #MEMBER_ATTRIBUTES   (
MEMBER_ID int,
MEMBER_PROPERTY varchar( 500 ),
MEMBER_VALUE varchar( 500 )
)
insert INTO #MEMBER_ATTRIBUTES ( MEMBER_ID ,MEMBER_PROPERTY
, MEMBER_VALUE
) select isnull( MEMBER_id ,'0' ),
ISNULL ( [MEMBER_PROPERTY] , '''') AS MEMBER_PROPERTY
, ISNULL( [MEMBER_VALUE] ,'''' ) AS MEMBER_VALUE
  from MEMBER_ATTRIBUTES where MEMBER_ID in (86481 )
DECLARE @cols AS NVARCHAR( MAX ),
    @query  AS NVARCHAR ( MAX)
SELECT @cols= stuff((
        SELECT ', ' +QUOTENAME ( MAX( MEMBER_PROPERTY ))
        FROM #MEMBER_ATTRIBUTES
        group by MEMBER_VALUE
        order by MEMBER_VALUE
        FOR XML PATH( '' )), 1 , 2, '');
SET @query = 'SELECT MEMBER_ID, ' + @cols + '
        from
         (
               SELECT MEMBER_ID,MEMBER_VALUE,MEMBER_PROPERTY FROM #MEMBER_ATTRIBUTES
        ) x
        pivot
        (
        MAX(MEMBER_VALUE)
            for x.MEMBER_PROPERTY in (' + @cols + ')
        ) p'
execute sp_executesql @query;
drop table #MEMBER_ATTRIBUTES

此查询以我想要的格式返回我的数据,即

Out Put Like this

但是当我尝试通过从insert中删除where条件来运行多个记录的上述查询时。它停止工作并向我抛出错误:

  

专栏'我的主要兴趣'被多次指定为' p'。

根据我的理解,上面的查询试图添加"我的主要兴趣"这是不可能的,这就是为什么我得到上述错误,现在我没有得到如何解决这个错误。我使用上面的脚本从我的旧问题得到答案,即My Old Question

请帮助我如何解决这个问题。

更新::

Here is data and table structure

2 个答案:

答案 0 :(得分:1)

在获取唯一列时添加distinct关键字:

SELECT @cols= stuff((
        SELECT distinct ', ' +QUOTENAME ( MAX( MEMBER_PROPERTY ))
        FROM #MEMBER_ATTRIBUTES
        group by MEMBER_VALUE
        --order by MEMBER_VALUE
        FOR XML PATH( '' )), 1 , 2, '');

Demo

答案 1 :(得分:0)

要动态获取列名,您需要使用以下内容:

SET @cols = STUFF((SELECT ',' + QUOTENAME(MEMBER_PROPERTY) 
            FROM #MEMBER_ATTRIBUTES
            group by MEMBER_PROPERTY, MEMBER_VALUE
            order by MEMBER_VALUE
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

这将选择不同的MEMBER_PROPERTY值并将它们转换为逗号分隔列表。