2016-12-02 85 views
1

我有一張表,我希望在SQL語句中取消轉義。它由一個人和電話1到5組成。現在我正在爲每部手機做一個聯盟,但我擔心它會導致性能問題。SQL Server unpivot列

列:

PERSON_GUID, 
PHONE_1, PHONE_1_VOICE_FLG, 
PHONE_2, PHONE_2_VOICE_FLG, 
PHONE_3, PHONE_3_VOICE_FLG, 
PHONE_4, PHONE_4_VOICE_FLG, 
PHONE_5, PHONE_5_VOICE_FLG 

如何將我最好的逆轉置在考慮性能的行,這樣的結果是:

PERSON_GUID, PHONE_NO, VOICE_FLG 
+0

你試圖使用PIVOT/UNPIVOT命令https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx – kevchadders

+0

應該是逆透視 –

+0

@ marc_s如果OP使用UNION而不是他正在做untivot。請回滾。 –

回答

1

我喜歡UNPIVOT,但作爲您的解決方案 -
確保您正在使用UNION ALL而不是UNION
UNION ALL只是溢出一個查詢結果之後。
UNION消除行重複,這是你付出的表現。


select PERSON_GUID,PHONE_NO, 
     case right(col,1) 
      when 1 then PHONE_1_VOICE_FLG 
      when 2 then PHONE_2_VOICE_FLG 
      when 3 then PHONE_3_VOICE_FLG 
      when 4 then PHONE_4_VOICE_FLG 
      when 5 then PHONE_5_VOICE_FLG 
     end VOICE_FLG 

from t unpivot (PHONE_NO for col in 
      (PHONE_1,PHONE_2,PHONE_3,PHONE_4,PHONE_5)) u 
+0

我認爲問題在於兩個電話(Phone_1,Phone_2等)都需要未知且VOICE_FLG(Phone_1_Voice_FLG,Phone_2_Voice_Flg等)需要不透明。所以這將需要一個雙重的unpivot操作,或者像OP提到的那樣,將所有語句聯合起來。 – Matt

+1

謝謝@Matt :-)我在這裏做了一個爛攤子。現在修復 –

+0

@jonesk,代碼現在工作 –