Sql 生成付款计划并计算运行总额

Sql 生成付款计划并计算运行总额,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我希望构建一个T-SQL存储过程,显示付款计划并维护付款总额。我正在获取有付款的行,但我需要显示所有行,无论是否已付款。主要的表格是 薪资计划“家长”记录 付款计划时间表-维护付款、到期金额等的时间表日期 PaymentPlanPayment-实际存储已支付的款项 我使用Over()子句来生成运行总数。如何修改此查询以返回尚未进行的计划付款?我的逻辑是: 谢谢 我将在这里做两个假设,希望它们是一个有根据的猜测,可能对您有所帮助: 1.未支付的案例计入总金额为0的运行总数 2.所有未支付的案例

我希望构建一个T-SQL存储过程,显示付款计划并维护付款总额。我正在获取有付款的行,但我需要显示所有行,无论是否已付款。主要的表格是

  • 薪资计划“家长”记录
  • 付款计划时间表-维护付款、到期金额等的时间表日期
  • PaymentPlanPayment-实际存储已支付的款项
我使用
Over()
子句来生成运行总数。如何修改此查询以返回尚未进行的计划付款?我的逻辑是: 谢谢


我将在这里做两个假设,希望它们是一个有根据的猜测,可能对您有所帮助:

1.未支付的案例计入总金额为0的运行总数
2.所有未支付的案例都出现在PaymentPlanSchedule中,但不在PaymentPlanPayments中

鉴于这两个假设成立,解决方案将是:

1.创建包含所有未付案例的未付cte
2.另一个cte AllPayed_和_Unpayed现在使PaymentPlanPayments和Unpayed、PaymentPlanPayments的联合保持其原始金额,而Unpayed默认为0
3.在查询中,使用此allpaid和unpaid代替PaymentPlanPayments

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

由于要在外部联接表上使用
where
子句放置筛选器,因此SQL Server将使其类似于内部联接


我们确实需要样本数据和预期结果。我们没有足够的信息告诉您如何执行此操作。感谢您的输入。我很感激。不幸的是,我找不到一种方法来将结果格式化为可读的表格格式,以保持其在问题中的格式。数据最好呈现为DDL和DML语句、@Mike或格式化的表格
text
(前者会好得多此链接非常感谢您的考虑!我尝试了您的建议,得到了相同的结果,只有记录具有PaymentPlanPayments的价值。
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
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