#sql #oracle
Подскажите пожалуйста, есть таблица, телефонный справочник:
FIO |type |Ph |
Иванов Семен Павлович |Внутр|11-11-11|
Иванов Семен Павлович |Внешн|3056 |
Сидоров Петр Евгеньевич|Внутр|22-22-22|
Сидоров Петр Евгеньевич|Внешн|4067 |
Как вывести такую таблицу SQL запросом?
FIO |PH1 |PH2
Иванов Семен Павлович |11-11-11|3056
Сидоров Петр Евгеньевич|22-22-22|4067
Ответы
Ответ 1
SELECT t1.FIO as FIO, t1.Ph as PH1, t2.Ph as PH2
FROM (
SELECT FIO, Ph
FROM
WHERE type = 'Внутр'
) AS t1
FULL OUTER JOIN (
SELECT FIO, Ph
FROM
WHERE type = 'Внешн'
) AS t2
ON t1.FIO = t2.FIO;
Ответ 2
Например так:
select a.fio,
(select b.ph from table b where a.fio = b.fio and b.type = 'Внутр'),
(select b.ph from table b where a.fio = b.fio and b.type = 'Внешн')
from table a
group by a.fio
Ответ 3
В MySQL можно так
select FIO,
GROUP_CONCAT(case when type='Внутр' then Ph else '' end) PH1,
GROUP_CONCAT(case when type='Внешн' then Ph else '' end) PH2
from ...
group by FIO
в Oracle должно что то быть похожее, тут например
Ответ 4
так ни кто и не написал про PIVOT, коменты не в счет
with s (fio, typ, ph)
as (select 'Иванов Семен Павлович'
, 'Внутр'
, '11-11-11'
from dual
union all
select 'Иванов Семен Павлович'
, 'Внеш'
, '3056'
from dual
union all
select 'Сидоров Петр Евгеньевич'
, 'Внутр'
, '22-22-22'
from dual
union all
select 'Сидоров Петр Евгеньевич'
, 'Внеш'
, '4067'
from dual
)
, rez
as (select *
from (select s.fio
, s.typ as k
, s.ph as val
from s
)
pivot (min(val) fro k in ('Внутр','Внеш'))
)
select * from rez
Ответ 5
select FIO
,max(case when type = 'Внутр' then Ph else NULL end) Ph1
,max(case when type = 'Внешн' then Ph else NULL end) Ph2
from t1
group by FIO
Комментариев нет:
Отправить комментарий