Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Расчет просрочек и пеней по платежам. Как реализовать в SQL Server?  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Есть 2 таблицы - Таблица кредитов и дебитов.
Обе имеют одну и ту же структуру:
id int, data datetime, docnum varchar(25), summa money
Накоплены данные за 3 года. Теперь надо посчитать были ли просрочки по платежам и на сколько дней и на какие суммы.
Разрешенная отсрочка - 30 дней. Значит за 31 день уже идет пеня, ее размер неважен. Ту проблема в том, что оплата может закрыть частично одну накладную и частично другую, которая, скажем, была неделей позже. А значит надо пеню считать не на всю накладную вторую, а лишь на ту часть, которая не была вовремя оплачена.
Пока я додумался до следующего - рассчитать нарастающий итог по дебитам и кредитам, добавив два поля - сумма с текущим значением (SumDeb и SumCred)и сумма без текущего значения (предыдущий итог как бы - PrevSumDeb и PrevSumCred)
Далее имеем 4 варианта:
a) Оплата полностью накрывает накладную -
PrevSumCred<=PrevSumDeb & SumCred>=SumDeb

SELECT MDS.dataoper AS deb_data, MDS.summa, MDS.PrevSD, MDS.SD, MAX(MCS.PrevSC) AS PrevSC, MIN(MCS1.SC) AS SC, MCS1.dataoper AS cred_data, 
               DATEDIFF(dd, MDS.dataoper, MCS1.dataoper) AS A
FROM  MUP_CRED_SUM MCS INNER JOIN
               MUP_CRED_SUM MCS1 ON MCS.dataoper = MCS1.dataoper AND MCS.summa = MCS1.summa RIGHT OUTER JOIN
               MUP_DEB_SUM MDS ON MCS1.SC >= MDS.SD AND MCS.PrevSC <= MDS.PrevSD
GROUP BY MDS.dataoper, MDS.summa, MDS.SD, MDS.PrevSD, MCS1.dataoper
ORDER BY MDS.dataoper, MDS.SD
b) Оплата полностью "умещается внутри" накладной -
PrevSumCred>PrevSumDeb & SumCred<SumDeb

SELECT MDS.dataoper AS deb_data, MDS.summa, MDS.PrevSD, MDS.SD, MAX(MCS.PrevSC) AS PrevSC, MIN(MCS1.SC) AS SC, MCS1.dataoper AS cred_data, 
               DATEDIFF(dd, MDS.dataoper, MCS1.dataoper) AS A
FROM  MUP_CRED_SUM MCS INNER JOIN
               MUP_CRED_SUM MCS1 ON MCS.dataoper = MCS1.dataoper AND MCS.summa = MCS1.summa INNER JOIN
               MUP_DEB_SUM MDS ON MCS1.SC < MDS.SD AND MCS.PrevSC > MDS.PrevSD
GROUP BY MDS.dataoper, MDS.summa, MDS.SD, MDS.PrevSD, MCS1.dataoper
ORDER BY MDS.dataoper, MDS.SD

c) Оплата частично "накрывает конец" накладной -
PrevSumCred>PrevSumDeb & SumCred>=SumDeb
d) Оплата частично "накрывает начало" накладной -
PrevSumCred<=PrevSumDeb & SumCred<SumDeb


Вроде так? Но это все концептуально, а как реализовать на деле - думаю.
Может кто сталкивался, у кого есть опыт, помогите, а...

PS Говорю я "накрывает", "влезает", "начало", "конец" потому, что графически представил дебет и кредит как два столбика, состояище из "кирпичиков" различной высоты, равной оплате. И если границы кирпичиков сопадают, то оплата и дебет в этом месте равны и т.п.
1 ноя 05, 15:30    [2027685]     Ответить | Цитировать Сообщить модератору
 Re: Расчет просрочек и пеней по платежам. Как реализовать в SQL Server?  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Grigoriy
Есть 2 таблицы - Таблица кредитов и дебитов.

здесь


Posted via ActualForum NNTP Server 1.3

1 ноя 05, 15:37    [2027734]     Ответить | Цитировать Сообщить модератору
 Re: Расчет просрочек и пеней по платежам. Как реализовать в SQL Server?  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
нормализация гласит, когда идет отношение многие ко многим что надо сделать?

для спящего время бодрствования равносильно сну
1 ноя 05, 15:52    [2027810]     Ответить | Цитировать Сообщить модератору
 Re: Расчет просрочек и пеней по платежам. Как реализовать в SQL Server?  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
А я не предполагал многие ко многим. Я тут у себя даже излишки обнаружил.
Вобщем предполагаю, что третий вариант будет такой:
SELECT MDS.dataoper AS deb_data, MDS.summa AS debit, MDS.PrevSD, MDS.SD, DATEDIFF(dd, MDS.dataoper, MCS.dataoper) AS A, MCS.dataoper, 
               MCS.summa, MCS.SC, MCS.PrevSC, MCS.PrevSC - MDS.SD AS DIF
FROM  MUP_CRED_SUM MCS INNER JOIN
               MUP_DEB_SUM MDS ON MCS.PrevSC < MDS.SD AND MCS.SC > MDS.SD AND MCS.PrevSC > MDS.PrevSD
GROUP BY MDS.dataoper, MDS.summa, MCS.PrevSC - MDS.SD, MDS.SD, MDS.PrevSD, MCS.dataoper, MCS.summa, MCS.SC, MCS.PrevSC
ORDER BY MDS.dataoper, MDS.SD
Где Dif - разница-"хвост", оплаченная из этой накладной очередным платежом.
1 ноя 05, 15:57    [2027836]     Ответить | Цитировать Сообщить модератору
 Re: Расчет просрочек и пеней по платежам. Как реализовать в SQL Server?  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Роман, спасибо, похожая задача, буду вникать в решение
1 ноя 05, 15:58    [2027839]     Ответить | Цитировать Сообщить модератору
 Re: Расчет просрочек и пеней по платежам. Как реализовать в SQL Server?  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Алексей2003
нормализация гласит, когда идет отношение многие ко многим что надо сделать?

Запихать все суммы в одну строку через запятую? :-))

PS: Правила русского языка гласят, что нормализация ничего гласить не может, так как является не объектом, а процессом.


Posted via ActualForum NNTP Server 1.3

1 ноя 05, 16:01    [2027855]     Ответить | Цитировать Сообщить модератору
 Re: Расчет просрочек и пеней по платежам. Как реализовать в SQL Server?  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Ага, кажется понял. Вы пошли по пути курсоров, имея переменные-буферы, с хранением остатков. Это первое, что я хоте использовать, но объем данных огромен, курсоры кажись подорвут все что можно - 3 года надо обсчитать.
Все таки хотелось бы запросами сначала попробовать...
1 ноя 05, 16:02    [2027861]     Ответить | Цитировать Сообщить модератору
 Re: Расчет просрочек и пеней по платежам. Как реализовать в SQL Server?  [new]
Taffy
Member

Откуда:
Сообщений: 20501
А мне вот это больше нравится
1 ноя 05, 16:08    [2027895]     Ответить | Цитировать Сообщить модератору
 Re: Расчет просрочек и пеней по платежам. Как реализовать в SQL Server?  [new]
Grigoriy
Member

Откуда: Краснодар
Сообщений: 1484
Вобщем я решли эту задачу 2 запросами для нарастающих итогов и одним, юнионом 4-х для различнх случаев оплаты
2 ноя 05, 15:28    [2031677]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить