mysql - 如何修复此查询?

时间:2012-02-22 02:21:57

标签: mysql sql

从前几天起,我真的很头疼如何修复这个mysql语句以获得我想要的结果。我还想告诉我,我是mysql和prorgramming的新手。

我有4个表CUSTOMER,CUSTOMER_ACCT_SETTING,DEBT和PAYMENT。

以下是4个表及其记录,以便您可以联系。

客户 Customer Table Record

CUSTOMER_ACCT_SETTING Customer Acct Setting Table Record

债务Debt Table Record

付款Payment Table Record

当我运行这个mysql语句时:

SELECT C.CUSTOMER_ID, C.NAME, C.ADDRESS, C.CONTACT_NUMBER,
    SUM(((CAS.INTEREST_RATE / 100) * D.AMOUNT) + D.AMOUNT) - COALESCE(SUM(P.AMOUNT), 0) AS CURRENT_BALANCE
FROM CUSTOMER C
INNER JOIN CUSTOMER_ACCT_SETTING CAS ON (C.CUSTOMER_ID = CAS.CUSTOMER_ID)
LEFT JOIN DEBT D ON (C.CUSTOMER_ID = D.CUSTOMER_ID)
LEFT JOIN PAYMENT P ON C.CUSTOMER_ID = P.CUSTOMER_ID
GROUP BY (C.CUSTOMER_ID)
ORDER BY C.NAME

结果如下:

Query Result

PS:结果按名称排序。

我的问题是:

1。)为什么我在第一行的CURRENT_BALANCE列中得到否定结果?我期待结果在16374.528附近。

我想要的结果是这样的:

Desired Result Table

2 个答案:

答案 0 :(得分:3)

您通过同时与两个表进行联接来预测您的所有债务。因此,您基本上可以在客户4上获得5个付款申请,在所有其他客户上获得零申请。 (所以P.AMOUNT上的NULL产生X - NULL = NULL)。要查看此信息,请删除“GROUP BY”和“SUM”,然后返回已付款和借记的金额。然后,如果您按客户手动对这些结果进行分组/求和,您将看到正在发生的事情。

要获得预期的结果,您需要使用子查询或其他一些机制,如临时表。像这样:

SELECT C.CUSTOMER_ID,
  (SELECT SUM(P.AMOUNT) FROM PAYMENT P 
   WHERE P.CUSTOMER_ID = C.CUSTOMER_ID) AS TOTAL_PAID_BY_CUSTOMER 
FROM CUSTOMER C

答案 1 :(得分:1)

#1的答案是结果集中的每一行都附加了付款。也就是说,对于客户#1,您将获得8132的三个实例。