Sql 如何根据另一个表中的金额总和计算金额

Sql 如何根据另一个表中的金额总和计算金额,sql,sql-server,Sql,Sql Server,我在工作的项目中,我需要计算金额目前在一个表对付款从另一个表 付款与订单id无关,而是与客户相关。您不知道哪个订单正在付款,因此您必须假设付款客户最早的订单是先付款的。在决定是否支付订单时,您需要知道客户支付的总金额以及该客户所有旧订单的总金额。剩余的付款金额是这两个金额之间的差额。如果差额大于或等于订单金额,则支付订单。否则就不行了 试试这个: select o.orderid , o.customer , o.amount , isnull((select sum(p.amount) fr

我在工作的项目中,我需要计算金额目前在一个表对付款从另一个表


付款与订单id无关,而是与客户相关。您不知道哪个订单正在付款,因此您必须假设付款客户最早的订单是先付款的。在决定是否支付订单时,您需要知道客户支付的总金额以及该客户所有旧订单的总金额。剩余的付款金额是这两个金额之间的差额。如果差额大于或等于订单金额,则支付订单。否则就不行了

试试这个:

select o.orderid
, o.customer
, o.amount
, isnull((select sum(p.amount) 
from paymentstable p 
where p.customer=o.customer),0) as paid_in_total
, isnull((select sum(o2.amount) 
from orderstable o2 
where o2.customer=o.customer 
and o2.orderid<o.orderid),0) as previous_order_amounts
, isnull((select sum(p.amount) 
from paymentstable p 
where p.customer=o.customer),0) - isnull((select sum(o2.amount) 
from orderstable o2 
where o2.customer=o.customer 
and o2.orderid<o.orderid),0) as remaing_payment
, case when isnull((select sum(p.amount) 
from paymentstable p 
where p.customer=o.customer),0) - isnull((select sum(o2.amount) 
from orderstable o2 
where o2.customer=o.customer 
and o2.orderid<o.orderid),0) >= o.amount then
    'paid'
else
    'unpaid'
end status

from orderstable o
order by o.orderid
可以删除“总额”、“上一次订单金额”和“剩余付款”列。我把它们放在那里是为了展示逻辑步骤


Albert

如果您在SQL Server 2012+上,则可以使用窗口版本的SUM with ORDER BY子句,该子句计算运行总计:

SELECT OrderId, o.Customer, Amount,
       CASE 
         WHEN SUM(Amount) OVER (PARTITION BY o.Customer 
                                ORDER BY OrderId) <= p.totalPayment 
         THEN 'Paid'
         ELSE 'Unpaid'
       END AS Status
FROM Orders AS o
LEFT JOIN (
   SELECT Customer, SUM(Amount) AS totalPayment
   FROM Payments
   GROUP By Customer
) AS p ON o.Customer = p.Customer
ORDER BY OrderId
如果每个客户的订单金额的总金额包含在总付款金额中,则选择“已付款”作为输出,否则输出为未付款