Моя сумма SQL, возвращающая двойные значения

Следующий запрос

SELECT
invoices.id,
SUM(payments.amount)
FROM adass.invoices
INNER JOIN adass.payments ON invoices.id=payments.id_invoice
GROUP BY invoices.id ORDER BY 1 desc LIMIT 0, 25

возвращает следующий результат

введите описание изображения здесь

Однако, когда я присоединяю другую таблицу к запросу, вот так:

SELECT
invoices.id,
SUM(payments.amount)
FROM adass.invoices
INNER JOIN adass.invoice_items ON invoices.id=invoice_items.id_invoice
INNER JOIN adass.payments ON invoices.id=payments.id_invoice
GROUP BY invoices.id ORDER BY 1 desc LIMIT 0, 25

Он дублирует сумму платежа для счета-фактуры с идентификатором 13919, фактически удваивая платеж 100 в таблице

введите описание изображения здесь

Чем это вызвано?

Я добавил содержание таблицы ниже

ТАБЛИЦА ПУНКТОВ СЧЕТА
введите описание изображения здесь

ТАБЛИЦА ПЛАТЕЖЕЙ
введите описание изображения здесь

ОБНОВЛЕНИЕ: более крупный запрос следующим образом

SELECT SQL_CALC_FOUND_ROWS invoices.id,
COALESCE(SUM(invoice_items.gross),0) AS gross,
COALESCE(SUM(invoice_items.net) - SUM(invoice_items.gross),0) AS vat,
COALESCE(SUM(invoice_items.net),0) AS net,
COALESCE(SUM(payments.amount),0),
COALESCE(SUM(payments.amount) - SUM(invoice_items.net),0) AS outstanding
FROM adass.invoices
LEFT JOIN adass.invoice_items ON invoices.id=invoice_items.id_invoice
LEFT JOIN adass.payments ON invoices.id=payments.id_invoice
GROUP BY invoices.id ORDER BY 1 desc LIMIT 0, 25

РЕЗУЛЬТАТ:
введите описание изображения здесь

0

Решение

Понятно что происходит. Ваш СЧЕТ № 13919 имеет два ПУНКТА СЧЕТА, следовательно, вы получаете двойной сумма оплаты счета, потому что ваш запрос генерирует две строки. Если бы у вас было три ПУНКТА СЧЕТА, то сумма была бы утроена.

Вы должны удалить это предложение из вашего запроса INNER JOIN adass.invoice_items ON invoices.id=invoice_items.id_invoice так как вы не используете столбцы из adass.invoice_items тем не мение.

Ваш запрос тогда будет:

SELECT invoices.id,
SUM(payments.amount)
FROM adass.invoices
INNER JOIN adass.payments ON invoices.id=payments.id_invoice
GROUP BY invoices.id ORDER BY 1 desc LIMIT 0, 25
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector