如何在unpivot语句中将字符串值转换为列?

时间:2018-05-21 14:58:56

标签: sql sql-server

我正在尝试编写一个unpivot查询,将每个用户存储在列中的用户数据转换为一行。这是迄今为止我所拥有的,感谢其他SO帖子: http://sqlfiddle.com/#!18/fa77c/2

错误(有意义,因为“email”是存储在Name列中的字符串):

  

无效的列名称'email'。

结束目标:

ID Email   Phone
1  a@a.com 111
2  b@b.com 222
3  NULL    333

4 个答案:

答案 0 :(得分:2)

不确定unpivot是否真的是你想要的。你可以通过一些聚合很容易地做到这一点。

select ac.AccountID
    , max(case when c.Name = 'email' then c.Data end) as Email
    , max(case when c.Name = 'phone' then c.Data end) as Phone
from AccountContacts ac
left join Contacts c on c.ID = ac.ContactID 
group by ac.AccountID

请注意您在这里挣扎的原因是因为您的数据结构是一种称为EAV(实体属性值)的反模式。与之合作真的很痛苦。如果可能的话,修复您的数据结构将是一个很好的计划。

答案 1 :(得分:1)

根据SQL小提琴中提供的所需结果和设置,您希望PIVOT数据,而不是UNPIVOT。

此查询可以解决问题:

with src as (
  select accountid
       , name
       , data
    from accountcontacts ac
    join contacts c
      on c.id = ac.contactid
)
select *
  from src
  pivot (max(data)
    for name in ([email],[phone])) pvt

答案 2 :(得分:1)

您可以执行条件聚合:

MyLoader::load()

答案 3 :(得分:0)

  select a.data email, b.data phone from  
   (select * from Contacts a 
    join AccountContacts b on a.id=b.ContactID where name='email')a
 full join (
     select * from Contacts a 
     join AccountContacts b on a.id=b.ContactID where name='phone'
  )b on a.AccountID=b.AccountID