【问题标题】:How to Use PIVOT with tables joined from two databases in SQL Server 2008 R2如何在 SQL Server 2008 R2 中对从两个数据库连接的表使用 PIVOT
【发布时间】:2014-04-16 05:18:22
【问题描述】:

我在加入两个数据库后获取数据,第一个是“listserver”,第二个是“newsletter”。

这是我的原始查询,它为一位订阅者返回 4 条记录。

select 
    gmin. MEMBER_PROPERTY,gmin .MEMBER_VALUE , m.*  
from 
    SUBSCRIBER s
inner join 
    listserv.dbo .MEMBER m on m.MEMBER_EMAIL= s.SUBSCRIBER_EMAIL
inner join 
    listserv.dbo .MEMBER_ATTRIBUTES gmin on gmin.MEMBER_ID= m.MEMBER_ID
where 
    s .SUBSCRIBER_GROUP  like '%abc%' 
order by 
    m.MEMBER_DATE_ADDED desc

此查询为单个订阅者返回 4 行,因为我在“MEMBER_ATTRIBUTES”表中有 4 个条目。

这是结构

现在我想为每个订阅者在一行中获取这些数据。我知道我可以使用 PIVOT 来做到这一点,但我不知道如何在上述查询中使用 PIVOT。

请帮助我如何实现我的目标,在此先感谢。

更新我想要以下格式的结果:

【问题讨论】:

  • 我可能不确定你要的是 PIVOT - 你能举个例子说明“结果”应该是怎样的吗?
  • @AllanS.Hansen 请检查我是否已使用所需的输出屏幕截图更新了问题
  • 查看此链接stackoverflow.com/a/11122225/2806972 可能会对您有所帮助。
  • 这里需要动态轴。请提供一些示例数据(以脚本形式,而不是屏幕截图!)以获得您需要的查询。我还可以给你一个通用的样本,你可以使用。

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


【解决方案1】:

我已使用以下查询来实现我的目标。 Use PIVOT for Multiple records in SQL SERVERGetting 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

【讨论】:

    猜你喜欢
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    相关资源
    最近更新 更多