在sql中优先与债权人分享现金

时间:2018-02-06 21:21:30

标签: sql sql-server sql-server-2014

我在sql 2014中有一个名为" tblPaymentPlan"的表。像这样:

Creditors    PlanToPay      َAmount
----------------------------------
A            2017-01-20     2000
A            2017-02-20     1500
A            2017-03-20     3000
B            2017-01-25     3000
B            2017-02-25     1000

还有另一个名为" tblPaid"如下:

Creditors    Paid      َ
-----------------
A            4500
B            3500

和我期望的结果:

Creditors    PlanToPay      َRemain
----------------------------------
A            2017-01-20     0
A            2017-02-20     0
A            2017-03-20     2000
B            2017-01-25     0
B            2017-02-25     500

我根本不知道做这份工作!你能不能帮我完成这份工作。请告知我的表格中有很多记录。 我需要这个查询预算计划。 (我们可以使用数字来定义优先级而不是日期)

2 个答案:

答案 0 :(得分:3)

你想要的是总计欠款,你可以减去所支付的款项。

SELECT Creditors, PlanToPay, IIF(ABS(Remain)!=Remain,0,IIF(Remain<Amount,Remain,Amount)) as Remain
FROM (SELECT pp.Creditors, pp.PlanToPay, pp.Amount,
  SUM(pp.Amount) OVER(PARTITION BY pp.Creditors ORDER BY pp.PlanToPay ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)-tp.paid AS Remain
  FROM tblPaymentPlan pp 
  JOIN (SELECT creditors, sum(paid) as paid from tblpaid group by creditors) tp
  ON pp.creditors = tp.creditors) ss
ORDER By Creditors, PlanToPay

SQLFiddle

在窗口函数(SUM OVER)中PARTITION分隔债权人,ORDER确定行的排列方式(按日期),ROWS子句告诉它在此行之前使用分区中的所有行,并在运行总计中包含此行。然后,我们从这个运行总计中减去支付给该债权人的所有东西的总和。

这当然给了我们很多负数,所以我们在子查询中做到了。主查询检查剩余的绝对值是否等于该值,如果是正数则为true,如果不是则为false,如果为真,则返回剩余值,否则返回0。

更新 - 为值仍然欠

的多行添加处理

答案 1 :(得分:1)

您可以从付费表格中的金额中减去运行总额,如果小于0,则将剩余设置为0,否则金额与运行总计的差异。

select pp.creditors,pp.plantopay,
case when sum(pp.amount) over(partition by pp.creditors order by pp.plantopay)-coalesce(pd.paid,0) <= 0 then 0
else sum(pp.amount) over(partition by pp.creditors order by pp.plantopay)-coalesce(pd.paid,0) end as remain
from tblpaymentplan pp
left join tblPaid pd on pp.creditors=pd.creditors