Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нарастающий итог 
V
    Опции темы
Неопытный
Дата 5.3.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



Есть набор данных, например:

A    70
B    60
C    35
D    22
E    12

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

То есть 2-е поле с нарастающим итогом. Как можно реализовать запросом такую выборку? Есть ли какая-нибудь агрегатная функция позволяющая это сделать. В Аксесе я решал такую задачу описанием функции, в которой глобальная переменная хранила значение предпоследней записи.
Может в Oracle  можно сделать как-то проще?
Заранее спасибо!
PM MAIL   Вверх
DimW
Дата 6.3.2007, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Аналитические функции тебе помогут:

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

Это сообщение отредактировал(а) DimW - 6.3.2007, 09:39
PM MAIL ICQ   Вверх
Sqlninja
Дата 6.3.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



Код

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


Это сообщение отредактировал(а) LSD - 6.3.2007, 12:26


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
LSD
Дата 6.3.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538




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

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




--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
DimW
Дата 6.3.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



все - "всех люблю, ни с кем не сорюсь" 

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

мда с двумя страницами я конечно перегнул... сори!!! 
PM MAIL ICQ   Вверх
Неопытный
Дата 6.3.2007, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



Спасибо за помощь! И за цитату из Кайта!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

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

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1068 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.