从前几天起,我真的很头疼如何修复这个mysql语句以获得我想要的结果。我还想告诉我,我是mysql和prorgramming的新手。
我有4个表CUSTOMER,CUSTOMER_ACCT_SETTING,DEBT和PAYMENT。
以下是4个表及其记录,以便您可以联系。
客户
CUSTOMER_ACCT_SETTING 的
债务的
付款的
当我运行这个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
结果如下:
PS:结果按名称排序。
我的问题是:
1。)为什么我在第一行的CURRENT_BALANCE列中得到否定结果?我期待结果在16374.528
附近。
我想要的结果是这样的:
答案 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的三个实例。