Аналитические функции тебе помогут:
Источник: Oracle для профессионалов Автор: Том Кайт
Цитата | Пример Простой пример подсчета промежуточной суммы зарплат по отделам с описанием того, что же в действительности происходит, позволят получить начальное представле- ние о принципах использования аналитических функций: tkyte@TKYTE816> break on deptno skip 1 tkyte@TKYTE816> select ename, deptno, sal, 2 sum (sal) over 3 (order by deptno, ename) running_total, 4 sum(sal) over 5 (partition by deptno 6 order by ename) department_total, 7 row_number() over 8 (partition by deptno 9 order by ename) seq 10 from emp 11 order by deptno, ename 12 /
ENAME DEPTNO SAL RUNNING_TOTAL DEPARTMENT_TOTAL SEQ CLARK 10 2450 2450 2450 1 KING 5000 7450 7450 2 MILLER 1300 8750 8750 3 ADAMS 20 1100 9850 1100 1 FORD 3000 12850 4100 2 JONES 2975 15825 7075 3 SCOTT 3000 18825 10075 4 SMITH 800 19625 10875 5
(тут я немного резанул)
В представленном выше коде удалось получить значение RUNNING_TOTAL для зап- роса в целом. Это было сделано по всему упорядоченному результирующему множеству с помощью конструкции SUM(SAL) OVER (ORDER BY DEPTNO, ENAME). Также уда- лось подсчитать промежуточные суммы по отделам, сбрасывая их в ноль при переходе к следующему отделу. Этого удалось добиться благодаря конструкции PARTITION BY Аналитические функции DEPTNO в SUM(SAL) — в запросе была указана конструкция, задающая условие раз- биения данных на группы. Для последовательной нумерации строк в каждой группе, в соответствии с критериями упорядочения, использовалась функция ROW_NUMBER() (для выдачи этого номера строки был добавлен столбец SEQ). В результате видно, что SCOTT — четвертый по списку сотрудник в отделе 20 при упорядочении по фамилии (ENAME). Функция ROW_NUMBER() используется и во многих других ситуациях, например для транспонирования или преобразования результирующих множеств (как будет описано далее). Этот новый набор функциональных возможностей содержит много замечательного. Он открывает абсолютно новые перспективы работы с данными. |
Пример конечно избыточный для твоего случая, но вполне понятный. поле RUNNING_TOTAL твой случай. |