#sql #sql_server #oracle
Есть таблица вида: create table table3 ( month_id number, -- Месяц (например, 201501 - январь 2015 г) type_id number, -- Признак абонента (2 значения: 1 - старый абонент, 2 - новый абонент) cnt number -- Кол-во абонентов ) Необходимо выдать результат по абонентам в следующем виде: Месяц, Кол-во старых абонентов, Кол-во новых абонентов Запрос: select distinct month_id as 'Месяц' ,(select distinct month_id, SUM(cnt) from table3 where type_id='1' group by month_id) as 'Кол-во старых абонентов' ,(select distinct month_id, SUM(cnt) from table3 where type_id='2' group by month_id) as 'Кол-во новых абонентов' from table3 Как избежать ошибки?
Ответы
Ответ 1
По моему так: insert into table3 select 201501, 1, 20 from dual union all select 201501, 2, 30 from dual union all select 201502, 1, 40 from dual union all select 201502, 2, 50 from dual union all select 201502, 1, 60 from dual union all select 201502, 2, 70 from dual ; select month_id as "Месяц", ( select sum (cnt) from table3 s where type_id='1' and s.month_id = t.month_id) as "Колво старых абонентов", ( select sum (cnt) from table3 s where type_id='2' and s.month_id = t.month_id) as "Колво новых абонентов" from table3 t group by month_id order by 1 ; Вывод: Месяц Колво старых абонентов Колво новых абонентов ---------- ------------------------------- ------------------------------- 201501 20 30 201502 100 120Ответ 2
Решение без вложенных подзапросов: with tab (month_id, type_id, cnt) as ( select 201501, 1, 20 from dual union all select 201501, 2, 30 from dual union all select 201502, 1, 40 from dual union all select 201502, 2, 50 from dual union all select 201502, 1, 60 from dual union all select 201502, 2, 70 from dual) select month_id, sum(case when type_id = '1' then cnt else 0 end), sum(case when type_id = '2' then cnt else 0 end) from tab group by month_id order by month_id
Комментариев нет:
Отправить комментарий