Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Нарастающий итог


Автор: Неопытный 5.3.2007, 18:52
Есть набор данных, например:

A    70
B    60
C    35
D    22
E    12

Нужно получить след. набор:
A    70
B    130
C    165
D    187
E    199

То есть 2-е поле с нарастающим итогом. Как можно реализовать запросом такую выборку? Есть ли какая-нибудь агрегатная функция позволяющая это сделать. В Аксесе я решал такую задачу описанием функции, в которой глобальная переменная хранила значение предпоследней записи.
Может в Oracle  можно сделать как-то проще?
Заранее спасибо!

Автор: DimW 6.3.2007, 09:32
Аналитические функции тебе помогут:

Источник: 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 твой случай.

Автор: Sqlninja 6.3.2007, 10:59
Код

SELECT ID,
       val,
       SUM (val) OVER (ORDER BY val RANGE UNBOUNDED PRECEDING) v_sum
FROM   t;

Автор: LSD 6.3.2007, 12:25

 ! 
LSD
DimWSqlninja, заканчиваем перепалку!

DimW к тебе персональна просьба на будущее - не приводить цитат на 2 страницы из Кайта, документации и т.п. Дай ссылку на источник и все. Захочет прочитает, не захочет читать его проблемы.


Автор: DimW 6.3.2007, 12:56
все - "всех люблю, ни с кем не сорюсь" 

Цитата(LSD @  6.3.2007,  12:25 Найти цитируемый пост)
DimW к тебе персональна просьба на будущее - не приводить цитат на 2 страницы из Кайта, документации и т.п.

мда с двумя страницами я конечно перегнул... сори!!! 

Автор: Неопытный 6.3.2007, 17:12
Спасибо за помощь! И за цитату из Кайта!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)