我已使用以下查询来实现我的目标。 Use PIVOT for Multiple records in SQL SERVER 和 Getting Null data while using PIVOT in sql server 2008 R2 questions 帮助我构建了这个查询。
CREATE Table #MEMBER_ATTRIBUTES (
MEMBER_ID int,
MEMBER_PROPERTY varchar( 500 ),
MEMBER_VALUE varchar( 500 ),
PRMEDIAUSER_ID int,
MEMBER_FULL_NAME nvarchar(500),
MEMBER_LAST_NAME nvarchar(500),
MEMBER_MID_INIT nvarchar(500),
MEMBER_FIRST_NAME nvarchar(500),
MEMBER_EMAIL nvarchar(500),
MEMBER_FAX nvarchar(500),
MEMBER_SEND_BY_FAX nvarchar(500),
MEMBER_LANGUAGE nvarchar(500),
COUNTRY_ID int,
MEMBER_ACTIVE int,
MEMBER_DATE_ADDED datetime,
MEMBER_COMPANY nvarchar(500),
MEMBER_ADDRESS nvarchar(500),
MEMBER_CITY nvarchar(500),
MEMBER_STATE nvarchar(500),
MEMBER_ZIP nvarchar(500),
MEMBER_POSTALCODE nvarchar(500),
MEMBER_PHONE nvarchar(500),
MEMBER_NEAREST_AIRPORT nvarchar(500),
MEMBER_OCCUPATION nvarchar(500),
MEMBER_COUNTY nvarchar(500)
)
insert INTO #MEMBER_ATTRIBUTES ( MEMBER_ID ,MEMBER_PROPERTY
, MEMBER_VALUE,PRMEDIAUSER_ID,MEMBER_FULL_NAME,MEMBER_LAST_NAME,MEMBER_MID_INIT,MEMBER_FIRST_NAME,
MEMBER_EMAIL,MEMBER_FAX,MEMBER_SEND_BY_FAX ,MEMBER_LANGUAGE ,COUNTRY_ID ,MEMBER_ACTIVE ,MEMBER_DATE_ADDED ,
MEMBER_COMPANY ,MEMBER_ADDRESS ,MEMBER_CITY ,MEMBER_STATE ,MEMBER_ZIP ,MEMBER_POSTALCODE ,
MEMBER_PHONE ,MEMBER_NEAREST_AIRPORT ,MEMBER_OCCUPATION ,MEMBER_COUNTY
) select isnull( m.MEMBER_ID ,'0' ),
ISNULL ( [gmin].[MEMBER_PROPERTY] , '''') AS MEMBER_PROPERTY
, ISNULL( [gmin].[MEMBER_VALUE] ,'''' ) AS MEMBER_VALUE,
m.PRMEDIAUSER_ID,m.MEMBER_FULL_NAME,m.MEMBER_LAST_NAME,m.MEMBER_MID_INIT ,
m.MEMBER_FIRST_NAME,
m.MEMBER_EMAIL,m.MEMBER_FAX ,m.MEMBER_SEND_BY_FAX,m.MEMBER_LANGUAGE ,
m.COUNTRY_ID ,m.MEMBER_ACTIVE,m.MEMBER_DATE_ADDED,m.MEMBER_COMPANY ,
m.MEMBER_ADDRESS ,m.MEMBER_CITY,m.MEMBER_STATE ,m.MEMBER_ZIP ,
m.MEMBER_POSTALCODE,m.MEMBER_PHONE ,m.MEMBER_NEAREST_AIRPORT ,
m.MEMBER_OCCUPATION,m.MEMBER_COUNTY
from SUBSCRIBER s
inner join listserv.dbo .MEMBER m on m.MEMBER_EMAIL= s.SUBSCRIBER_EMAIL
left join listserv.dbo .MEMBER_ATTRIBUTES gmin on gmin.MEMBER_ID= m.MEMBER_ID
where s .SUBSCRIBER_GROUP like '%abc%' and m.MEMBER_ACTIVE=1
--select * from #MEMBER_ATTRIBUTES
DECLARE @cols AS NVARCHAR( MAX ),
@query AS NVARCHAR ( MAX)
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, '');
SET @query = 'SELECT MEMBER_ID,
PRMEDIAUSER_ID,
MEMBER_FULL_NAME,
MEMBER_LAST_NAME,
MEMBER_MID_INIT ,
MEMBER_FIRST_NAME,
MEMBER_EMAIL,
MEMBER_FAX ,
MEMBER_SEND_BY_FAX,
MEMBER_LANGUAGE ,
COUNTRY_ID ,
MEMBER_ACTIVE,
MEMBER_DATE_ADDED,
MEMBER_COMPANY ,
MEMBER_ADDRESS ,
MEMBER_CITY,
MEMBER_STATE ,
MEMBER_ZIP ,
MEMBER_POSTALCODE,
MEMBER_PHONE ,
MEMBER_NEAREST_AIRPORT ,
MEMBER_OCCUPATION,
MEMBER_COUNTY ' + @cols + '
from
(
SELECT MEMBER_ID,MEMBER_VALUE,MEMBER_PROPERTY,PRMEDIAUSER_ID,
MEMBER_FULL_NAME,
MEMBER_LAST_NAME,
MEMBER_MID_INIT ,
MEMBER_FIRST_NAME,
MEMBER_EMAIL,
MEMBER_FAX ,
MEMBER_SEND_BY_FAX,
MEMBER_LANGUAGE ,
COUNTRY_ID ,
MEMBER_ACTIVE,
MEMBER_DATE_ADDED,
MEMBER_COMPANY ,
MEMBER_ADDRESS ,
MEMBER_CITY,
MEMBER_STATE ,
MEMBER_ZIP ,
MEMBER_POSTALCODE,
MEMBER_PHONE ,
MEMBER_NEAREST_AIRPORT ,
MEMBER_OCCUPATION,
MEMBER_COUNTY FROM #MEMBER_ATTRIBUTES ) x
pivot
(
MAX(MEMBER_VALUE)
for x.MEMBER_PROPERTY in (' + @cols + ')
) p'
execute sp_executesql @query;
drop table #MEMBER_ATTRIBUTES