я пытаюсь получить данные за каждый месяц, если нет данных за определенный месяц, я поставлю нуль. Я уже создал таблицу календаря, чтобы я мог присоединиться к ней, но я все равно не могу получить нуль.
Здесь мой запрос
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);
Это устраняет проблемы с вашим запросом:
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.Вы должны использовать право в соответствии с вашим запросом, потому что ваша таблица календаря присутствует на правой стороне
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