Создание запроса для вычисления остатков по счетам

Helenka
Дата: 16.12.2002 17:37:37
Есть таблица: номер счета (AccId), Приход (Debet), Расход (Credit), Код валюты (CurrId), Дата (ValueDate).
В эту таблицу заносятся суммарные приходы/расходы по счету за те даты, за которые были движения по счету в данной валюте.
Остаток на нек. дату по некоторому счету вычисляется как сумма всех Debet и Credit для данного счета по всем датам меньше заданной (плюс фильтр по валюте).
Необходимо посчитать средние остатки по счетам за нек. период (т.е. входные параметры - даты начала и конца периода).
Как это оптимальнее всего сделать?
tpg
Дата: 16.12.2002 18:14:55
Как, как?!

Запросом, естественно. С группировкой по счетам и валюте.
Helenka
Дата: 16.12.2002 18:42:35
Непонятно, как. Одним запросом это не сделаешь, по-моему. И как двумя с разумными затратами времени - тоже не понимаю.

Поясню на конкретном примере.
Пусть есть 3 записи по счету Х:
Дата Приход Расход
01/01 2 -3
02/01 5 -2
03/01 10 -4
Тогда остатки по счету Х будут:
Дата Остаток
01/01 -1 (2 + (-3))
02/01 2 (-1 + 5 - 2)
03/01 8 (2 + 10 - 4)

Т.е. для расчета остатков на нек. дату надо расчитать остатки на все предыдущие даты, а потом по рассчитанным остаткам уже среднее считать.

Если можете привести подобный запрос (или последовательность запросов), приведите, пожалуйста.
Зайцев Фёдор
Дата: 16.12.2002 18:56:06
А с подзапросом? Тоже никак?
Дед Маздай
Дата: 16.12.2002 18:59:01
Helenka, tpg хотел сказать, что примерно так:

select AccID, (sum(Debet) + sum(Credit)) / count(1) from t where CurrID = <код валюты> and ValueDate < <дата конца периода> group by AccID

Насчет начала периода я не уверен. Вы же не храните остаток на эту дату. Значит нужно суммировать все движение с момента сотворения мира, когда остатки по счетам были нулевые.
Зайцев Фёдор
Дата: 16.12.2002 19:55:05
2Дед Маздай
Судя по всему, дата сотворения мира >= 01.01.1753
8)
Helenka
Дата: 17.12.2002 11:28:08
2Дед Маздай:
А будет ли работать этот запрос адекватно для тех случаев, когда у счета нет записей о приходах/расходах за какую-то дату (т.е. когда остаток по счету остается неизменным в течение некоторого периода времени). По-моему, этот запрос будет выдавать некорректный результат...
Helenka
Дата: 17.12.2002 11:59:34
Да, вот еще, насчет начала периода: считаем, что остаток на самую раннюю дату по счету, по которой есть информация о приходе/расходе, остаток на эту самую раннюю дату равен 0.
Cat2
Дата: 17.12.2002 12:38:27
Для остатка по счетам дата начала не нужна.

В Вашем случае элементарно работает

select AccID, CurrID, sum(Debet+ Credit) from t where
ValueDate <=EndDate
group by AccID,CurrID


Получите остатки с группировкой по счетам и валютам. А как с курсом валюты быть, если ее надо пересчитывать в какую-то одну - это уже другой вопрос.

Лично мне данная структура таблицы не нравится, на мой взгляд, гораздо лучше иметь
Код счета (AccId), Количество (Quantity), Код валюты (CurrId), Дата (ValueDate)
Количество будет с плюсом для прихода и с минусом для расхода.

Как быть, если таблица растет и время выполнения становится все больше и больше - мне сейчас подробно писать лень. В общих чертах - операции старше n лет сбрасываются в архив.
Helenka
Дата: 17.12.2002 12:44:56
2Cat2:
Так как же средний за период остаток-то считать? Если на каждую дату такой запрос, то средний-то как?