如何解决如何编写将电话号码从列转换为单列的 SQL 查询?
如何编写将电话号码从列转换为单列的 SQL 查询。假设有多个 personID,每个 personID 最多有 3 种电话类型,Primary、Secondary 和 Tertiary。目前,对于每个人,他们被列在三个单独的列中。
期望的结果是电话号码都在一列中,另一列有电话类型
当前数据
Person_ID | Primary_Phone | Secondary_Phone | Tertiary_Phone |
---|---|---|---|
1 | 2221111111 | 5551111111 | 9991111111 |
2 | 2221111112 | 5551111112 | 9991111112 |
3 | 2221111113 | 5551111113 | 9991111113 |
4 | 2221111114 | 5551111114 | 9991111114 |
所需数据
Person_ID | 电话号码 | 电话类型 |
---|---|---|
1 | 2221111111 | 主要 |
1 | 5551111111 | 中学 |
1 | 9991111111 | 大专 |
2 | 2221111112 | 主要 |
2 | 5551111112 | 中学 |
2 | 9991111112 | 大专 |
3 | 2221111113 | 主要 |
3 | 5551111113 | 中学 |
3 | 9991111113 | 大专 |
4 | 2221111114 | 主要 |
4 | 5551111114 | 中学 |
4 | 9991111114 | 大专 |
解决方法
在 Oracle 12c 版开始,您可以使用 cross apply
将列反透视为行:
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'
)
)
显示查询正在运行的 liveSQL link
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。