Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Частичная сумма

350
04 сентября 2007 года
cheburator
589 / / 01.06.2006
Известно, что с помощью агрегатных функций можно вычислить сумму по некоторой колонке. А можно ли для каждой строки выдать накопленную (частичную) сумму? Например, есть таблица поступления товара, там две колонки - дата и количество поступившего товара в этот день. Нужно получить результирующую таблицу, которая содержала бы дату и остаток товара на эту дату.
263
04 сентября 2007 года
koltaviy
816 / / 16.12.2004
Это не окончательное решение.
Лишь наталкиваю на мысль :)
 
Код:
SELECT t1.Дата, (SELECT SUM(t2.Количество) FROM Таблица1 t2 WHERE t2.Дата<=t1.Дата) AS НакопленнаяСумма
FROM Таблица1 t1
..
10
05 сентября 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: cheburator
Например, есть таблица поступления товара, там две колонки - дата и количество поступившего товара в этот день. Нужно получить результирующую таблицу, которая содержала бы дату и остаток товара на эту дату.


Из чего складывается остаток? Это сумма остатка предыдущего дня + поступление за сегодня, то есть рекурсия?

Какой сервер?

350
14 сентября 2007 года
cheburator
589 / / 01.06.2006
Цитата: koltaviy
 
Код:
SELECT t1.Дата, (SELECT SUM(t2.Количество) FROM Таблица1 t2 WHERE t2.Дата<=t1.Дата) AS НакопленнаяСумма
FROM Таблица1 t1
..


Точно. Как-то не подумал.

350
14 сентября 2007 года
cheburator
589 / / 01.06.2006
Цитата: Freeman
Из чего складывается остаток? Это сумма остатка предыдущего дня + поступление за сегодня, то есть рекурсия?

Какой сервер?


Да, рекурсия, по сути.
Сервер не уточняю - скажем так, задача теоретическая.
Вариант koltaviy подходит, и вот тут уже возникает практический вопрос - насколько это обоснованно с точки зрения быстродействия. СУБД будет выполнять подзапрос заново для каждой строки надзапроса или как? В основном интересует firebird, но и остальные серваки тоже.

10
15 сентября 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: cheburator
СУБД будет выполнять подзапрос заново для каждой строки надзапроса или как?


Естественно. А с учётом того, что число суммируемых строк будет возрастать с каждой следующей, затраты на выполнение запроса будут расти в прогрессии.

Цитата: cheburator
В основном интересует firebird, но и остальные серваки тоже.


В Oracle можно поиграться с prior, пытаясь представить результат цепочкой или развёрнутым деревом. За результат не ручаюсь, но алгоритм будет фактически однопроходным, как если бы вручную вычисления прописать. Попробовать стоит. Или rolllup/grouping - ещё один способ.

Так что сервер имеет значение.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог