powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / долг нарастающим итогом (хитро)
7 сообщений из 7, страница 1 из 1
долг нарастающим итогом (хитро)
    #33294718
Perederiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблицы
клиент
1 id1,god,mesyz,saldon,saldok
saldon - долг на начало месяца
saldok - -----------конец месяца
сортировка по id1,god,mesyz

начисление
2 id1,id2,summa

льготы
3 id1,id3,summa

оплата
4 id1,id4,summa

В таблицах 2,3,4 может быть по несколько записей с одним id1 или не быть вовсе

Надо составить запрос на обновление saldon и saldok нарастающим итогом
1) для первой записи в наборе id1 saldon всегда 0, для последующих saldon равно saldok предыдущей записи
2) saldok=saldon+sum(id2.summa)-sum(id3.summa)-sum(id4.summa)
3) при смене значения id1 для первой записи в наборе id1 saldon всегда 0 и т.д.

Горю !!!

Спасибо
...
Рейтинг: 0 / 0
долг нарастающим итогом (хитро)
    #33294903
Paul Chabinsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не сложно покажите на примере с данными, исходные таблички, результирующая табличка, а то не очень понятно :)
...
Рейтинг: 0 / 0
долг нарастающим итогом (хитро)
    #33294921
Paul Chabinsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаю актуально ли то что я напишу ниже, но...
Я бы посоветовал Вам сделать таблицу с движениями и таблицу с типами операций.

Табл1: КлиентID, ДатаОперации, ОперацияID, Приход, Расход.

Табл2: ОперацияID, ОперацияОписание.

Тем самым вы бы упростили себе жизнь, т.к. не надо делать одинаковых таблиц и переписывать каждый раз запрос на получение сальдо... Хотя конечно можно ваши таблицы объеденить юнионом в представление, но это вряд ли харошая идея.
...
Рейтинг: 0 / 0
долг нарастающим итогом (хитро)
    #33295079
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PerederiyЕсть таблицы
клиент
1 id1,god,mesyz,saldon,saldok
saldon - долг на начало месяца
saldok - -----------конец месяца
сортировка по id1,god,mesyz

начисление
2 id1,id2,summa

льготы
3 id1,id3,summa

оплата
4 id1,id4,summa

В таблицах 2,3,4 может быть по несколько записей с одним id1 или не быть вовсе

Надо составить запрос на обновление saldon и saldok нарастающим итогом
1) для первой записи в наборе id1 saldon всегда 0, для последующих saldon равно saldok предыдущей записи
2) saldok=saldon+sum(id2.summa)-sum(id3.summa)-sum(id4.summa)
3) при смене значения id1 для первой записи в наборе id1 saldon всегда 0 и т.д.

Горю !!!

Спасибо
Если дело действительно обстоит так (все таблы одинаковы, нет сложных условий типа штрафов с шифтами по времени, которые в свою очередь еще как-то зависят от времени)- воспользуйтесь предложением предыдущего оратора. (слейте таблицу в одну).

Но в случае произвольной структуры попросту создается набор (юнионом по всем необходимым запросам на момент фактов возникновения/погашения задолжности/изменения условий начисления и тп. - т.е. на все моменты, важные для алгоритма расчета сальдо, причем юнион берется отсортированным по моментам этих фактов), и пробегом по этому набору в цикле FOR LOOP вы можете реализовать любой алгоритм расчета баланса с "зависящими от времени" условиями.
...
Рейтинг: 0 / 0
долг нарастающим итогом (хитро)
    #33326298
grfmaniak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня подобный вопрос:

есть таблица s_main, в которой хранятся начисления, упрощенно id, man_id, price,month,year
вторая таблица (p_main) содержит платежи, если они есть - id, man_id, pay_id, cash,month,year
третья таблица (saldo) содержит остатки на начало месяца - id, man_id,month,year,dolg
а также таблица abon, где хранятся данные абонентов, скажем id,fio и т.д.

задача в том, чтобы взять остатки на начало текущего месяца, вычислить итог на конец месяца и внести его в saldo на начало следующего месяца.

Пробую хотя бы вывести требуемые результаты, примерно так:

select a.id, a.fio, sum(s.price) as sprice, sum(p.cach) as pprice, sd.sda, sd.dolg+(sum(s.price)-sum(p.cach)) as new from abon as a,s_main as s left outer join p_main as p on (pay_id=p.id), saldo as sd where a.id=s.man_id and sd.man_id=a.id and s.month=9 and s.year=2005 and sd.year=2005 and sd.month=8 group by a.id,sd.sda,a.fio order by a.fio,new;

Однако, в случае отсутствия оплаты на какое-либо начисление, в результате появляютсяз начения NULL, которые я никак не могу превратить в 0. Подскажите, как это сделать.
...
Рейтинг: 0 / 0
долг нарастающим итогом (хитро)
    #33326832
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grfmaniakОднако, в случае отсутствия оплаты на какое-либо начисление, в результате появляютсяз начения NULL, которые я никак не могу превратить в 0. Подскажите, как это сделать.
попробуй так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select a.id, a.fio, 
       coalesce(sum(s.price),  0 ) as sprice,
       coalesce(sum(p.cach),  0 ) as pprice,
       sd.sda,
       sd.dolg + ( coalesce(sum(s.price),  0 ) - coalesce(sum(p.cach),  0 ) ) as new
  from abon as a,
       s_main as s
  left outer join p_main as p on (pay_id=p.id),
       saldo as sd
 where a.id=s.man_id
   and sd.man_id=a.id
   and s.month= 9 
   and s.year= 2005 
   and sd.year= 2005 
   and sd.month= 8 
 group by a.id, sd.sda, a.fio
 order by a.fio, new;
...
Рейтинг: 0 / 0
долг нарастающим итогом (хитро)
    #33327154
grfmaniak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, помогло :)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / долг нарастающим итогом (хитро)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]