2015-02-24 86 views
2
SELECT ID, PHONE1, PHONE2, PHONE3, EMAIL1, EMAIL2, EMAIL3, EMAIL4 
FROM (SELECT ...) 

如何将它转换为此?将多列转换成行

*ID | PHONE | EMAIL* 

SELECT DISTINCT ID, PHONE, EMAIL 
FROM ... 

我可以做多种选择和UNION他们,但我不知道是否有这样做的更好的方法。我的查询长度为400行,并且执行多个工会将变得很糟糕!

+0

这实际上是一个不透明而不是透视。 Unpivot将多个列转换为行。枢轴则相反。既然你想要转换“对”列,IMO最简单的方法就是组合。 – Taryn 2015-02-24 20:55:16

+0

而这个问题就是为什么你不会像第一个那样构建表格。如果问题是“哪个客户端的电话号码是12345678?”,则会出现同样的问题。“因为您必须明确检查每个列。如果在一个连接中需要这个列(尽管这不太可能),那么对你而言就是一个祸根。如果你需要存储更多的号码或电子邮件地址,这也是不灵活的。 – Turophile 2015-02-24 21:27:30

回答

1

正如bluefeet所说,要将列转换为行,您需要使用unpivot。 在你的情况下,你应该做两次unpivot,电话和电子邮件。例如:

SELECT id,phone,email FROM (
select id,phone,EMAIL1, EMAIL2, EMAIL3, EMAIL4 from ... 
unpivot (
phone for p1 
in (PHONE1, PHONE2, PHONE3) 
)) 
unpivot (
email for e1 
in (EMAIL1, EMAIL2, EMAIL3, EMAIL4) 
);