如何编写将电话号码从列转换为单个列的SQL查询?

如何编写将电话号码从列转换为单个列的SQL查询?,sql,oracle,union,unpivot,lateral-join,Sql,Oracle,Union,Unpivot,Lateral Join,如何编写将电话号码从列转换为单个列的SQL查询。假设有多个personID,每个personID最多有3种电话类型,主要、次要和第三。目前,对于每个人,他们被列在三个单独的列中 理想的结果是电话号码都在一列中,而另一列包含电话类型 当前数据 个人识别码 主电话 辅助电话 第三方电话 1. 2221111111 5551111111 9991111111 2. 2221111112 5551111112 9991111112 3. 2221111113 5551111113 9991111113

如何编写将电话号码从列转换为单个列的SQL查询。假设有多个personID,每个personID最多有3种电话类型,主要、次要和第三。目前,对于每个人,他们被列在三个单独的列中

理想的结果是电话号码都在一列中,而另一列包含电话类型

当前数据

个人识别码 主电话 辅助电话 第三方电话 1. 2221111111 5551111111 9991111111 2. 2221111112 5551111112 9991111112 3. 2221111113 5551111113 9991111113 4. 2221111114 5551111114 9991111114
在Oracle 12c版的起始版本中,您可以使用
交叉应用

select t.person_id, x.*
from mytable t
cross apply (
    select primary_phone as phone_number, 'Primary' as phone_type from dual
    union all select secondary_phone, 'Secondary' from dual
    union all select tertiary_phone, 'Tiertiary' from dual
) x
在早期版本中,您可以使用
union all

select person_id, primary_phone as phone_number, 'Primary' as phone_type from mytable
union all select person_id, secondary_phone, 'Secondary' from mytable
union all select person_id, tertiary_phone, 'Tiertiary' from mytable

您似乎想执行
unpivot

with p as (
  select 1 person_id, 
         '2221111111' primary_phone, 
         '5551111111' secondary_phone, 
         '9991111111' tertiary_phone
    from dual
  union all
  select 2, 
         '2221111112' primary_phone, 
         '5551111112' secondary_phone, 
         '9991111112' tertiary_phone
    from dual
)
select person_id,
       phone_number,
       phone_type
  from p
unpivot (
  phone_number
  for phone_type in (
     primary_phone as 'Primary',
     secondary_phone as 'Secondary',
     tertiary_phone as 'Tertiary'
  )
)

A显示正在运行的查询

非常感谢。无论哪种选择都会很有帮助谢谢。。。