【问题标题】:Columns values as row heading列值作为行标题
【发布时间】:2017-03-09 15:33:03
【问题描述】:

我有一张包含合作伙伴详细信息的表格,例如 [ID]、[PartnerName]、[webaddress]、[short description] 等。

在我存储社交地址的另一个表中,该表的架构如下所示:

我想要的输出是

合作伙伴表中的 ID、PartnerName、网址、[简短描述] 和社交表中的 [Twitter]、[Facebook]、[LinkedIn]

名称列中可用的值应出现在该特定合作伙伴的输出表的列标题中

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

【问题讨论】:

  • 当 name = 'twitter' 时选择 case,然后 value 以 twitter 结尾,当 name = 'linkedin' 然后 value 以 linkedin 结尾时选择 case....
  • 我也有同样的想法......但假设 x 合作伙伴有一个新的社交地址,比如 instagram,在这种情况下,我需要写一个新案例。我想跳过这些案例。我想要的是 - 社交表中特定合作伙伴的任何内容都应该出现在标题 - 值对中。
  • 请给出预期结果。

标签: sql-server tsql


【解决方案1】:

请使用PIVOT 功能做你想做的事。 你可以看到这个问题的答案:Convert Rows to columns using 'Pivot' in SQL Server

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

【讨论】:

    【解决方案2】:

    您可以使用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
    

    【讨论】:

    • 谢谢@MPR,我得到了预期的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2014-03-16
    • 2017-04-21
    • 2013-11-09
    相关资源
    最近更新 更多