mySQL Left Join для нескольких таблиц

0

Я действительно борюсь с этим запросом. У меня есть 4 таблицы (http://oberto.co.nz/db-sql.png):

Invoice_Payement, счет-фактура, клиент и календарь. Я пытаюсь создать отчет, подытожив "paid_amount" col, в Invoice_Payment, по месяцам/годам.

  • Запрос должен включать все месяцы, даже те, у которых нет данных
  • Запрос нуждается в условии (таблица счетов): registered_id = [id]

Я пробовал с нижеследующим запросом, который работает, но не подходит, если "paid_date" не имеет записей за месяц. Результат заключается в том, что месяц не отображается в результатах

Я добавил таблицу календаря, чтобы решить эту проблему, но не знаю, как присоединиться к ней.

SELECT 
   MONTHNAME(Invoice_Payments.date_paid) as month, 
   SUM(Invoice_Payments.paid_amount) AS total
FROM Invoice, Client, Invoice_Payments
WHERE Client.registered_id = 1
AND Client.id = Invoice.client_id
And Invoice.id = Invoice_Payments.invoice_id
AND date_paid IS NOT NULL
GROUP BY YEAR(Invoice_Payments.date_paid), MONTH(Invoice_Payments.date_paid)

См. приведенную выше ссылку для базовой диаграммы ERD моего сценария.

База данных: http://oberto.co.nz/ Ожидаемый результат: мой текущий запрос, ниже, вернет что-то вроде:

month       total
August      5
September   0
October  196
November  205
December  214
January  229

Спасибо за чтение. Я отправил этот Q раньше, но я думаю, что это не так.

  • 0
    Вы хотите просто список итогов за каждый месяц? Зачем вам нужен date_paid IS NOT NULL в вашем предложении WHERE? Есть ли на самом деле платежи в вашей таблице Invoice_Payments с нулевой датой_платы?
Теги:
left-join

3 ответа

0
Лучший ответ

Обновлено: P, Будет ли это работать?

SELECT YEAR(calendar.date_field) as year,
 MONTHNAME(calendar.date_field) as month,
 SUM(Invoice_Payments.paid_amount) AS total 
FROM calendar
 left outer join invoice_Payments on calendar.date_field = invoice_Payments.date_paid
 left outer join Invoice on invoice_payments.invoice_id = invoice.invoice_id
 left outer join (select * from client where registered_id = 1) as c on c.id = Invoice.client_id
GROUP BY YEAR(calendar.date_field), MONTH(calendar.date_field)
  • 0
    Не совсем, но спасибо. Он работает, за исключением того, что он не отображает месяцы с отсутствующими записями Invoice_Payments.date_paid. Вот почему я предполагаю, что мне нужно сделать левое соединение в таблице календаря.
  • 0
    Как насчет этого?
Показать ещё 9 комментариев
0

Это также может работать...

SELECT MONTHNAME(Invoice_Payments.date_paid) as month, SUM(Invoice_Payments.paid_amount) AS total
FROM Client
LEFT OUTER JOIN Invoice ON Client.id = Invoice.client_id
LEFT OUTER JOIN Invoice_Payments ON Invoice.id = Invoice_Payments.invoice_id
WHERE Client.registered_id = 1 AND date_paid IS NOT NULL
GROUP BY YEAR(Invoice_Payments.date_paid), MONTH(Invoice_Payments.date_paid);
  • 1
    Этому вопросу больше года. Можете ли вы объяснить, как улучшается ваш ответ на существующий запрос?
0

Очевидно, проблема заключается в том, что вы не выполняете левое соединение, поэтому решение может состоять в том, чтобы переписать запрос, чтобы использовать синтаксис соединения, где вы можете указать, что вы хотите левое соединение. Что-то вроде

Выберите * из счета кликов слева клиента client.id = invoice.client_id left join

И так далее

  • 0
    Спасибо MTilsted. Я понимаю, что мне нужно левое соединение, и создание только левого соединения - это то, что я могу сделать, но при добавлении с другими условиями - я просто не могу решить это.
  • 0
    Ну, похоже, правильный запрос чуть ниже этого ответа:}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню