ПРОБЛЕМА
Проблема здесь в том, что существуют последовательные внутренние объединения, и число строк, извлекаемых во втором внутреннем соединении, не ограничено. Таким образом, поскольку мы не добавили условие для sales_payment_id в объединении между таблицами sales и sales_payment, одна строка в таблице продаж (в данном случае для customer_id 2) будет сопоставлена с 2 строками в таблице платежей. Это вызывает пересмотр одних и тех же значений. Другими словами, отображение для customer_id 2 между 3 таблицами составляет 1: 1: 2, а не 1: 1: 1.
РЕШЕНИЕ
Решение 1: Как упомянутый Гордоном, вы могли бы сначала агрегировать значения сумм в таблице sales_payments, а затем агрегировать значения в таблице продаж.
Решение 2. В качестве альтернативы (ИМХО лучший подход), вы можете добавить внешний ключ между продажами и таблицы оплаты. Например, столбец sales_payment_id таблицы sales_payment также может быть введен в таблицу продаж. Это облегчит объединение этих таблиц и уменьшит дополнительные издержки при запросе данных.
Запрос будет выглядеть следующим образом:
`SELECT c.customer_id,
c.name,
SUM(s.total),
s.created_at,
SUM(sp.amount)
FROM customer c
INNER JOIN sales s
ON c.customer_id = s.customer_id
INNER JOIN sales_payments sp
ON c.customer_id = sp.customer_id
AND s.sales_payments_id = sp.sales_payments_id
WHERE s.created_at ='2020-04-03'
GROUP BY c.customer_id,
c.name,
s.created_at ;`
Надеюсь, это поможет!