【问题标题】:Use column names as values for Phone Number使用列名作为电话号码的值
【发布时间】:2019-12-17 22:47:09
【问题描述】:

我有一张表格,其中的电话号码分成不同的列,手机、家庭电话、工作电话和其他电话。我想做某种转换,将所有电话拉入一列,但在下一列中显示电话关系,因此目前我的数据如下所示:

CellPhone  HomePhone  workPhone   OtherPhone
8756785468 8756944858 8756944903  8937944858

我想看什么:

TelephoneNumber  TelephoneRelationship
8756785468       Cell
8756944858       Home
8756944903       Work
8937944858       Other

我的创建语句相当简单:

Create Table ods.Telephone(
    CellPhoneNumber varchar(10) null,
    HomePhoneNumber varchar(10) null,
    WorkPhoneNumber varchar(10) null,
    OtherPhoneNumber Varchar(10) null
);

【问题讨论】:

标签: sql sql-server union unpivot case-statement


【解决方案1】:

通过CROSS APPLY 只需多一个选项

Select A.ID
      ,B.*
 From  Telephone A
 Cross Apply ( values (CellPhoneNumber,'Cell')
                     ,(HomePhoneNumber,'Home')
                     ,(WorkPhoneNumber,'Work')
                     ,(OtherPhoneNumber,'Other')
             ) B(TelephoneNumber,TelephoneRelationship)

退货

ID  TelephoneNumber TelephoneRelationship
1   8756785468      Cell
1   8756944858      Home
1   8756944903      Work
1   8937944858      Other

【讨论】:

  • 我赞成,尽管我讨厌以逗号开头的代码行。好久没见你了。
  • @GordonLinoff 我们之前已经讨论过这个......注释行更容易,而且,分隔符只是一个分隔符。如果是 PIPE,你会有同样的感觉吗?有趣的是(和个人的)风格是多么重要,例如,当我看到 {...} AS {...} 时我的脖子收紧了 :)
  • 出于同样的原因,我也更喜欢以逗号开头的行。我认识很多其他人看到它时会畏缩。 :D
【解决方案2】:

我建议使用 union all 进行反透视。

这是一个标准的跨 RDBMS 解决方案,在我看来,它的语法更易于理解和记忆,并且通常表现得与供应商特定的解决方案一样好,甚至更好:

select id, CellPhoneNumber TelephoneNumber, 'Cell' TelephoneRelationship from Telephone
union all select id, HomePhoneNumber,  'Home'  from Telephone
union all select id, WorkPhoneNumber,  'Work'  from Telephone
union all select id, OtherPhoneNumber, 'Other' from Telephone

Demo on DB Fiddle

样本数据:

身份证 |手机号码 |家庭电话号码 |工作电话号码 |其他电话号码 -: | :---------------- | :---------------- | :---------------- | :--------------- 1 | 8756785468 | 8756944858 | 8756944903 | 8937944858

结果:

编号 |电话号码 |电话关系 -: | :---------------- | :-------------------- 1 | 8756785468 |细胞 1 | 8756944858 |家 1 | 8756944903 |工作 1 | 8937944858 |其他

【讨论】:

    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多