我正在使用以下查询
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
此查询以我想要的格式返回我的数据,即
但是当我尝试通过从insert中删除where条件来运行多个记录的上述查询时。它停止工作并向我抛出错误:
专栏'我的主要兴趣'被多次指定为' p'。
根据我的理解,上面的查询试图添加"我的主要兴趣"这是不可能的,这就是为什么我得到上述错误,现在我没有得到如何解决这个错误。我使用上面的脚本从我的旧问题得到答案,即My Old Question
请帮助我如何解决这个问题。
更新::
答案 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, '');
答案 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
值并将它们转换为逗号分隔列表。