Исходный ответ для MySQL
В вашем запросе в основном две ошибки:
FORMAT
- это функция, которая преобразует число в строку. Итак, MySQL сначала преобразует вашу дату в число (что даже не должно быть возможным и вызовет ошибку, но MySQL, тем не менее, преобразует его в какое-то число), а затем имеет смысл формата 'yyyy_MM', возможно, принимая ММ означает Мьянму, я не знаю. Я предполагаю, что вы получаете разные значения для каждого дня вместо одного значения в месяц. Вместо этого вы хотите DATE_FORMAT(date, '%Y-%m')
. - Вы пытаетесь сгруппировать по месяцам, но затем отображаете дату. Какая дата? В месяце может быть до 31 даты. Вместо этого вы должны отобразить месяц, по которому вы сгруппировали (т.е. снова
DATE_FORMAT(date, '%Y-%m')
).
Что касается разделения положительных и отрицательных сумм, вы можете использовать условную агрегацию, т.е. CASE WHEN
внутри функции агрегирования (SUM
).
SELECT
DATE_FORMAT(date, '%Y-%m') AS month,
article,
SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) AS positive_total,
SUM(CASE WHEN amount < 0 THEN amount ELSE 0 END) AS negative_total
FROM shop
GROUP BY DATE_FORMAT(date, '%Y-%m'), article
ORDER BY DATE_FORMAT(date, '%Y-%m'), article;
Обновленный ответ для SQL сервера
In SQL Server FORMAT(date, 'yyyy_MM')
- это функция для получения года и месяца свидание. Запрос отсюда:
SELECT
FORMAT(date, 'yyyy_MM') AS month,
article,
SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) AS positive_total,
SUM(CASE WHEN amount < 0 THEN amount ELSE 0 END) AS negative_total
FROM shop
GROUP BY FORMAT(date, 'yyyy_MM'), article
ORDER BY FORMAT(date, 'yyyy_MM'), article;