Да, Oracle имеет расширенные механизмы для группировки данных: Функции ROLLUP, CUBE, GROUPING и SETING GROUP SETS . В вашем случае группировка наборов кажется многообещающей.
Это моя таблица:
create table t(a, b, c, d, e, f) as (
select 'A1', 'B1', 'C1', 'D1', 'E1', 701 from dual union all
select 'A2', 'B1', 'C2', 'D1', 'E2', 702 from dual union all
select 'A2', 'B1', 'C2', 'D1', 'E3', 703 from dual );
Ваши запросы отличаются только в части group by
, и вы, естественно, выбираете разные столбцы, которые являются базой групп , where
условия и условные подсчеты не важны. Ваш выбор выглядит следующим образом:
select a, count(1) from t group by a;
select b, c, count(1) from t group by b, c;
select d, e, count(1) from t group by d, e;
Вы можете сделать это:
select a, b, c, d, e, grouping_id(a, b, c, d, e) grp_id, count(1) cnt
from t
group by grouping sets( (a, null), (b, c), (d, e) )
, который выводит:
A B C D E GRP_ID CNT
-- -- -- -- -- ---------- ----------
A1 15 1
A2 15 2
B1 C1 19 1
B1 C2 19 2
D1 E1 28 1
D1 E2 28 1
D1 E3 28 1