2012-02-22 107 views
1

我真的很头痛,因为如何解决这个mysql语句来获得我想要的结果。我也想告诉我,我是新来的MySQL和prorgramming。mysql - 如何解决这个查询?

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

这里是4张表与他们的记录,所以你可以联系。

CUSTOMER Customer Table Record

CUSTOMER_ACCT_SETTING Customer Acct Setting Table Record

债务 Debt Table Record

PAYMENT 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

+0

为什么投票下来?我的问题有什么问题?这是一个非常严肃的问题......我真的很难解决这个问题。我想问那个投票的人告诉我什么是错的。 – NinjaBoy 2012-02-22 02:26:03

+0

我已经通过使用COALESCE(SUM(P.AMOUNT),0)解决了第二个问题, – NinjaBoy 2012-02-22 02:38:42

回答

3

你被用做在同一时间两个表联接通过所有的债务投影付款。因此,您实质上获得了5次客户4付款申请和所有其他客户零申请。 (因此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,您获得了8132的三个实例。