2012-02-22 140 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的三個實例。