Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

SQL вывод столбцов из строк

#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

Комментариев нет:

Отправить комментарий