2016-12-02 83 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,代码现在工作 –