2015-02-24 91 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) 
);