列值为行标题

时间:2017-03-09 06:03:40

标签: sql-server tsql

我有一张包含合作伙伴详情的表格,如[ID],[PartnerName],[webaddress],[简短描述]等。

在另一个表中,我存储了社交地址,该表的模式如下所示: enter image description here

我想要的输出是

ID,PartnerName,webaddress,[简短说明]来自合作伙伴表和[Twitter],[Facebook],[LinkedIn]来自社交表

“名称”列中可用的值应位于我的输出表的列标题中,用于该特定合作伙伴

我们可以通过SQL查询来实现吗?

2 个答案:

答案 0 :(得分:2)

请根据需要使用PIVOT功能。 您可以在此问题上看到答案:Convert Rows to columns using 'Pivot' in SQL Server

您还可以阅读有关如何转动表格的MSDN文档:https://msdn.microsoft.com/en-us/library/ms177410.aspx

答案 1 :(得分:1)

您可以使用pivot,但如果您不知道社交网站的名称,并且它可能会随着添加而有所不同,您需要通过使用动态sql来执行此类操作。请注意,为了使用数据透视,它假定每个社交类型的每个合作伙

create table #partners (
    ID int
    ,PartnerName nvarchar(100)
    ,WebAddress nvarchar(100)
    ,ShortDescription nvarchar(100)
)

create table #social  (
    ID int
    ,Name nvarchar(100)
    ,Value nvarchar(100)
    ,PartnerID int
    ,IsActive int 
)

insert into #partners 
values (1, 'Bob Jones', 'www.bobjones.com', 'bob desc')
,(2, 'Mike Smith', 'wwww.mikesmith.com', 'mike desc')

insert into #social
values (1, 'Facebook', 'www.facebook.com/bobjones', 1,1)
,(2, 'Twitter', 'wwww.twitter.com/bobjonestweets', 1,1)
,(3, 'Linkedin','wwww.linkedin.com/msmith', 2,1)
,(4, 'Facebook', 'www.facebook.com/smitty',2,1)

declare @columns nvarchar(max) = (
    select '[' + Name + '],' 
    from (select distinct Name from #social ) Name 
    for xml path ('')) 

declare @SQL nvarchar(max)
set @SQL = 'select *
            from (
                    select p.ID, PartnerName, WebAddress, ShortDescription, Name, Value
                    from #partners p
                    join #social s on p.ID = s.PartnerID
                    where s.IsActive = 1
            ) s
            pivot ( max(Value) for [Name] in (' + left(@columns, len(@columns)-1) +
            ')) as piv'

exec sp_executesql @SQL