Использование T-SQL для генерации графика платежей и расчета промежуточного итога - PullRequest
0 голосов
/ 09 октября 2019

Я собираюсь создать хранимую процедуру T-SQL, которая отображает графики платежей и поддерживает текущую сумму выполненных платежей. Я получаю строки, по которым есть платежи, но мне нужно отобразить все строки, независимо от того, были ли платежи произведены или нет. Основными таблицами являются

  • PaymentPlan - «родительская» запись
  • PaymentPlanSchedule - поддерживает даты графика платежей, причитающиеся суммы,и т. д.
  • PaymentPlanPayment - фактически хранит сделанные платежи.

Я использую предложение Over () для генерации промежуточного итога. Как я могу изменить этот запрос для возврата запланированных платежей, которые еще не были сделаны? Вот моя логика: Спасибо!

SELECT pp.PApKey, pps.PPSScheduleDate AS ScheduledDate, pps.PPSScheduleAmount AS ScheduledAmount, ppp.PPPAmount AS PaidAmount, 
    SUM(ppp.PPPAmount) OVER (PARTITION BY pp.PApKey ORDER BY pps.PPSScheduleDate) AS PaymentTotal
FROM
    LawFirm lf INNER JOIN MgmtCo mc ON mc.LFpKey = lf.LFpKey
    INNER JOIN Assoc a ON mc.MCpKey = a.MCpKey
    INNER JOIN [Case] c ON c.ASpKey = a.ASpKey
    INNER JOIN PaymentPlan pp ON pp.CApKey = c.CApKey
    RIGHT OUTER JOIN PaymentPlanSchedule pps ON pps.PApKey = pp.PApKey
    RIGHT OUTER JOIN PaymentPlanPayments ppp ON pps.PPSpKey = ppp.PPSpKey
WHERE lf.LFpKey = @LFpKey
    AND mc.MCpKey = @MCpKey
    AND a.ASpKey = @ASpKey
    AND c.CAActive = 1
    AND pp.PAActive = 1
    AND pps.PPSActive = 1
    AND ppp.PPPActive = 1

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Поскольку вы помещаете фильтр, используя предложение where для внешних объединяемых таблиц, SQL Server сделает его внутренним объединением.

Showing move where part in join

SELECT pp.PApKey, pps.PPSScheduleDate AS ScheduledDate, pps.PPSScheduleAmount AS 
       ScheduledAmount, ppp.PPPAmount AS PaidAmount, 
       SUM(ppp.PPPAmount) OVER (PARTITION BY pp.PApKey ORDER BY pps.PPSScheduleDate) AS PaymentTotal
FROM
       LawFirm lf INNER JOIN MgmtCo mc ON mc.LFpKey = lf.LFpKey
       INNER JOIN Assoc a ON mc.MCpKey = a.MCpKey
       INNER JOIN [Case] c ON c.ASpKey = a.ASpKey
       INNER JOIN PaymentPlan pp ON pp.CApKey = c.CApKey
       RIGHT OUTER JOIN PaymentPlanSchedule pps ON pps.PApKey = pp.PApKey
                                                   and pp.PAActive = 1
       RIGHT OUTER JOIN PaymentPlanPayments ppp ON pps.PPSpKey = ppp.PPSpKey
                                                   and pps.PPSActive = 1
 WHERE lf.LFpKey = @LFpKey
       AND mc.MCpKey = @MCpKey
       AND a.ASpKey = @ASpKey
       AND c.CAActive = 1
       --AND pp.PAActive = 1
       --AND pps.PPSActive = 1
       --AND ppp.PPPActive = 1
0 голосов
/ 10 октября 2019

Я собираюсь сделать два предположения здесь, в надежде, что они - обоснованное предположение, которое может вам помочь:

1. То, что неоплаченные дела учитываются в промежуточном итоге с суммой 0.
2. Все неоплаченные дела - это те, которые присутствуют в PaymentPlanSchedule, но не в PaymentPlanPayments.

При соблюдении этих двух допущений решение будет следующим:

1. Создайте неоплаченный cte, содержащий все неоплаченные дела.
2. Другой cte allpaid_and_unpaid, который теперь делает объединение PaymentPlanPayments и неоплаченных, PaymentPlanPayments сохраняет свою первоначальную сумму, в то время как по умолчанию неоплачиваемое значение равно 0.
3. В вашем запросе используйте вместо этого PaymentPlanPayments этот allpaid_and_unpaid.

with unpaid as
(
select 
pp.PApKey, 
pps.PPSScheduleDate AS ScheduledDate,
pps.PPSScheduleAmount AS ScheduledAmount,
0 AS PaidAmount
from 
LawFirm lf INNER JOIN MgmtCo mc ON mc.LFpKey = lf.LFpKey
INNER JOIN Assoc a ON mc.MCpKey = a.MCpKey
INNER JOIN [Case] c ON c.ASpKey = a.ASpKey
INNER JOIN PaymentPlan pp ON pp.CApKey = c.CApKey
RIGHT OUTER JOIN PaymentPlanSchedule pps ON pps.PApKey = pp.PApKey
where
lf.LFpKey = @LFpKey
AND mc.MCpKey = @MCpKey
AND a.ASpKey = @ASpKey
AND c.CAActive = 1
AND pp.PAActive = 1
AND pps.PPSActive = 1
AND NOT EXISTS
(
 SELECT * from PaymentPlanPayments ppp where pps.PPSpKey = ppp.PPSpKey AND 
 ppp.PPPActive = 1)
),
allpaid_and_unpaid as 
(
SELECT pp.PApKey, 
pps.PPSScheduleDate AS ScheduledDate,
pps.PPSScheduleAmount AS ScheduledAmount,
ppp.PPPAmount AS PaidAmount, 
FROM
  LawFirm lf INNER JOIN MgmtCo mc ON mc.LFpKey = lf.LFpKey
  INNER JOIN Assoc a ON mc.MCpKey = a.MCpKey
  INNER JOIN [Case] c ON c.ASpKey = a.ASpKey
  INNER JOIN PaymentPlan pp ON pp.CApKey = c.CApKey
  RIGHT OUTER JOIN PaymentPlanSchedule pps ON pps.PApKey = pp.PApKey
  RIGHT OUTER JOIN PaymentPlanPayments ppp ON pps.PPSpKey = ppp.PPSpKey
WHERE lf.LFpKey = @LFpKey
  AND mc.MCpKey = @MCpKey
  AND a.ASpKey = @ASpKey
  AND c.CAActive = 1
  AND pp.PAActive = 1
  AND pps.PPSActive = 1
  AND ppp.PPPActive = 1

UNION

SELECT * FROM unpaid

)
SELECT PApKey, 
ScheduledDate,
ScheduledAmount,
PaidAmount, 
SUM(PaidAmount) OVER (PARTITION BY PApKey ORDER BY ScheduleDate) AS PaymentTotal
FROM
allpaid_and_unpaid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...