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