我正在尝试编写一个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
答案 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