Как написать SQL-запрос, который преобразует телефонные номера из столбцов в один столбец?

Как написать SQL-запрос, преобразующий телефонные номера из столбцов в один столбец. Предположим, что существует несколько идентификаторов personID, и каждый personID имеет до 3 типов телефонов: основной, дополнительный и третичный. В настоящее время для каждого человека они перечислены в трех отдельных столбцах.

Желаемый результат - все номера телефонов будут в одном столбце, а в другом столбце будут указаны типы телефонов.

Текущие данные

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 Phone_Number Phone_Type
1 2221111111 Primary
1 5551111111 Secondary
1 9991111111 Tertiary
2 2221111112 Primary
2 5551111112 Secondary
2 9991111112 Tertiary
3 2221111113 Primary
3 5551111113 Secondary
3 9991111113 Tertiary
4 2221111114 Primary
4 5551111114 Secondary
4 9991111114 Tertiary

person cmomah    schedule 30.12.2020    source источник


Ответы (2)


Похоже, вы хотите сделать 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, показывающая выполняющийся запрос.

person Justin Cave    schedule 30.12.2020
comment
Большое спасибо... - person cmomah; 31.12.2020

В 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
person GMB    schedule 30.12.2020
comment
Большое спасибо. Любой вариант, безусловно, поможет - person cmomah; 31.12.2020