2012-02-22 3 views
1

У меня действительно болит голова с тех пор, как исправить эту инструкцию mysql, чтобы получить желаемый результат. Я также хочу сообщить, что я новичок в mysql и прорграммировании.mysql - Как исправить этот запрос?

У меня есть 4 таблицы КЛИЕНТ, 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

+0

Зачем голосовать вниз ??? Что не так с моим вопросом? Это очень серьезный вопрос ... Мне действительно трудно решить это. Я хочу спросить того, кто проголосовал за это, чтобы рассказать мне, что случилось. – NinjaBoy

+0

Я решил второй вопрос, используя COALESCE (SUM (P.AMOUNT), 0) – NinjaBoy

ответ

3

Вы проецируете свои платежи через все ваши долги, делая объединение с обеих таблиц одновременно. Таким образом, вы, по сути, получаете 5 заявок на платеж 4 и нулевые приложения для всех остальных клиентов. (поэтому NULL на P.AMOUNT дает 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.

Смежные вопросы