【问题标题】:SQL Server unpivot columnsSQL Server 反透视列
【发布时间】:2016-12-02 16:04:48
【问题描述】:

我有一个表,我想在 SQL 语句中取消透视。它由一个人和电话 1 到 5 组成。现在我正在为每部电话做一个联合,但我担心它会导致性能问题。

列:

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

【问题讨论】:

  • 您是否尝试过使用 PIVOT/UNPIVOT 命令technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx
  • 应该是unpivot
  • @marc_s 如果 OP 使用 UNION 而不是他正在执行 unpivot。请回滚。
  • @DuduMarkovitz:你认为我应该“回滚”什么?我只是尝试清理演示文稿,并将“mssql”替换为正确的产品名称 - SQL Server - 我没有更改任何其他内容.....
  • 我同意这听起来像是多列的反透视。 Jonesk 也许您可以添加一些示例数据和所需的结果来澄清?

标签: sql sql-server pivot


【解决方案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 

【讨论】:

  • 我认为问题在于(Phone_1、Phone_2 等)的两个电话都需要取消转轴,而(Phone_1_Voice_FLG、Phone_2_Voice_Flg 等)的 VOICE_FLG 需要取消转轴。因此,这将需要一个双重反透视操作,或者只是将所有语句合并为 OP 提到的它们正在做的事情。
  • 谢谢@Matt :-) 我在这里搞得一团糟。现已修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多