Получая все значения за каждый месяц, поставьте ноль, если нет данных за этот месяц

0

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

Здесь мой запрос

SELECT calendar.month, IFNULL(SUM(transaction_payment.total),0) AS total 
FROM 'transaction' 
JOIN 'transaction_payment' ON 'transaction_payment'.'trans_id' = 
'transaction'.'trans_id' 
LEFT JOIN 'calendar' ON MONTH(transaction.date_created) = calendar.month 
WHERE'date_created' LIKE '2017%' ESCAPE '!' 
GROUP BY calendar.month 
ORDER BY 'date_created' ASC

значение в моих таблицах календаря составляет 1-12 (январь-декабрь) int

Результат должен быть примерно таким

month   total
1       0
2       20
3       0
4       2
..
11      0
12      10

ОБНОВИТЬ

Проблема заключается в том, что функция СУММ

SELECT c.month, COALESCE(t.trans_id, 0) AS total 
FROM calendar c
LEFT JOIN transaction t ON month(t.date_created) = c.month AND year(t.date_created) = '2018' 
LEFT JOIN transaction_payment tp ON tp.trans_id = t.trans_id 
ORDER BY c.month ASC

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

COALESCE(SUM(tp.total), 0);
  • 0
    каков ваш текущий выход?
  • 0
    Я получаю значения только с данными за месяц.
Теги:
codeigniter
mysqli

2 ответа

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

Это устраняет проблемы с вашим запросом:

SELECT c.month, COALESCE(SUM(tp.total), 0) AS total 
FROM calendar c LEFT JOIN
     transaction t
     ON month(t.date_created) = month(c.month) AND
        year(t.date_created) = '2017' LEFT JOIN
     transaction_payment tp
     ON tp.trans_id = t.trans_id 
GROUP BY c.month 
ORDER BY MIN(t.date_created) ASC;

Это будет работать, только если таблица "календарь" имеет одну строку в месяц - это кажется странным, но это может быть ваша структура данных.

Обратите внимание на изменения:

  • Начните с таблицы calendar, потому что это строки, которые вы хотите сохранить.
  • Не используйте LIKE с датами. MySQL имеет правильные функции date. Используй их.
  • Условия фильтрации для всех, кроме первой таблицы, должны быть в предложении ON, а не в WHERE.
  • Я предпочитаю COALESCE() для IFNULL() потому что COALESCE() является стандартом ANSI.
  • 0
    Привет, спасибо за совет. Но результат тот же, я все еще не могу получить месяцы без данных.
0

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

SELECT calendar.month, IFNULL(SUM(transaction_payment.total),0) AS total 
FROM 'transaction' 
JOIN 'transaction_payment' ON 'transaction_payment'.'trans_id' = 
'transaction'.'trans_id' 
RIGHT JOIN 'calendar' ON MONTH(transaction.date_created) = calendar.month 
WHERE'date_created' LIKE '2017%' ESCAPE '!' 
GROUP BY calendar.month 
ORDER BY 'date_created' ASC

Ещё вопросы

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