111 подписчиков

Печеньки от Oracle. Нарастающий итог и вклад

972 прочитали

В Oracle SQL есть замечательный класс аналитических функций.

Генератор данных и задача

Предположим, у нас есть некая последовательность значений. Генерируем ее с помощью иерархического запроса:

select level as x
from dual
connect by level <= 5
;
1
2
3
4
5

Теперь мы хотели бы посчитать нарастающий итог, т.е. на каждой строке получить сумму всех предыдущих. Эта задача актуальна, например, для визуализации динамики суммарной выручки магазина за отчетный период по зафиксированным значениям дневной выручки. Или для накопительной статистики посещения сайта. А потом оценить вклад каждой строки в суммарный итог.

Нарастающий итог

С помощью аналитической суммы это очень просто. Запишем наш генератор последовательности "вне запроса", конструкция with будет имитировать таблицу:

with tab as
(
select level as x from dual connect by level <= 5
)
select x,
sum(x) over (order by x) as cum_sum
from tab
;
1 1
2 3
3 6
4 10
5 15

Вклад в сумму

А вклад строки в общую сумму - "долю в отчете" - получить еще проще. Мы только для удобства умножим результат на 100, округлим до второго знака и приклеим символ процента:

with tab as
(
select level as x from dual connect by level <= 5
)
select x, sum(x) over (order by x) as cum_sum
, round(
ratio_to_report(x) over () * 100, 2)||' %' as ratio
from tab
;
1 1 6,67 %
2 3 13,33 %
3 6 20 %
4 10 26,67 %
5 15 33,33 %

Запрос в консоли Oracle SQL Developer
Запрос в консоли Oracle SQL Developer

Вот так просто делаются отчеты с помощью Oracle SQL.
А Oracle APEX позволяет за считанные минуты публиковать готовые отчеты в Web.