如何编写查询来计算今天的到期金额?

时间:2012-02-12 02:25:10

标签: mysql

我已安排付款,所以我有这些表格:

customer
+id

paymentSchedule
+id
+customer_id
+amount  //total price 
+dueDate //date to be paid

payments
+id
+date
+customer_id
+paymentSchedule_id
+amount  //amount paid, it can be a partial payment

如何编写查询以获取客户的今天到期金额。 我的意思是我需要加入表格(这是我的主要问题),然后减去 payment.mount的总和减去scheduledPaymens.amount的总和 但是......怎么样? 提前致谢

3 个答案:

答案 0 :(得分:1)

这可能不是100%,但应该非常可靠,以帮助您调整:

SELECT customer_id, (due.amount - paid.amount) as amountDue
FROM
    (SELECT customer_id, SUM(amount) as amount 
     FROM paymentSchedule 
     WHERE dateDate <= getDate()
     and customer_id = @custid) as due
   LEFT JOIN
     (SELECT customer_id, SUM(amount) as amount
     FROM payments
     WHERE customer_id = @custid) as paid ON paid.customer_id = due.customer_id

答案 1 :(得分:0)

这样的事情应该是你调整的好起点。

    SELECT c.*
      FROM customer c
INNER JOIN paymentSchedule ps
        ON c.id = ps.customer_id
 LEFT JOIN payments p
        ON ps.id = p.paymentSchedule_id
     WHERE ps.dueDate = 'This depends on how you store dueDate'
       AND ps.amount - p.amount > 0

答案 2 :(得分:0)

好的,这就是我理解这个问题的方法。我简化了表格,因为它们只会使事情变得复杂,而且添加日期也很简单。

<强> PaymentSchedule

+----+-------------+-----------------+
| id | customer_id | original_amount |
+----+-------------+-----------------+
|  1 | Tom         |             100 |
|  2 | Tom         |             200 |
|  3 | Tom         |             300 |
|  4 | Moe         |             400 |
+----+-------------+-----------------+

<强>付款

+----+--------------------+-------------+
| id | paymentSchedule_id | paid_amount |
+----+--------------------+-------------+
|  1 |                  1 |          70 |
|  2 |                  2 |         150 |
|  3 |                  2 |          50 |
|  4 |                  4 |         300 |
|  5 |                  4 |          25 |
+----+--------------------+-------------+

查询结果

+-------------+-------------------+-----------------+-----------+----------------+
| CUSTOMER_ID | PAYMENTSCHEDULEID | ORIGINAL_AMOUNT | TOTALPAID | PENDINGPAYMENT |
+-------------+-------------------+-----------------+-----------+----------------+
| Tom         |                 1 |             100 |        70 |             30 |
| Tom         |                 2 |             200 |       200 |              0 |
| Tom         |                 3 |             300 |         0 |            300 |
| Moe         |                 4 |             400 |       325 |             75 |
+-------------+-------------------+-----------------+-----------+----------------+

使用双重选择查询

select *, s.original_amount - s.TotalPaid as PendingPayment from (
  select
    ps.customer_id, ps.id as PaymentScheduleId, ps.original_amount,
    coalesce(sum(p.paid_amount), 0) as TotalPaid
  from paymentSchedule ps
  left join payments p on p.paymentSchedule_id = ps.id
  group by ps.customer_id, PaymentScheduleId, ps.original_amount
) as S

使用单一选择查询

select
  ps.customer_id, ps.id as PaymentScheduleId, ps.original_amount,
  coalesce(sum(p.paid_amount), 0) as TotalPaid,
  ps.original_amount - coalesce(sum(p.paid_amount), 0) as PendingPayment
from paymentSchedule ps
left join payments p on p.paymentSchedule_id = ps.id
group by ps.customer_id, PaymentScheduleId, ps.original_amount

两个查询的结果都是一样的。我只是想知道哪一个跑得更快。您可以尝试两种方式并告诉我们:)

如果这是您期望的结果,请告诉我