У меня есть запрос
SELECT DATE_FORMAT(sys_date, '%Y-%c') as month, COUNT(DATE_FORMAT(sys_date, '%Y-%c'))
FROM sale
GROUP BY month
ORDER BY month ASC
Это возвращает следующий результат:
month COUNT(DATE_FORMAT(sys_date, '%Y-%c'))
2017-10 204
2017-11 178
2017-12 88
2017-7 3
2017-8 1
2017-9 153
2018-1 91
2018-2 86
2018-3 67
2018-4 109
2018-5 131
2018-6 47
2018-7 50
2018-8 36
2018-9 39
Как сделать вывод в правильном порядке возрастания? Нравиться,
month COUNT(DATE_FORMAT(sys_date, '%Y-%c'))
2017-7 3
2017-8 1
2017-9 153
2017-10 204
2017-11 178
2017-12 88
2018-1 91
2018-2 86
2018-3 67
2018-4 109
2018-5 131
2018-6 47
2018-7 50
2018-8 36
2018-9 39
Я пробовал использовать MONTH(month), YEAR(month) ASC
и многие другие варианты, перечисленные на сайте. Но вроде ничего не работает.
Сортировка данных на основе ГОД и МЕСЯЦ, полученных напрямую от sys_date
. Поскольку у вас включен режим only_full_group_by
, вам нужно будет получить значения YEAR
и MONTH
в части SELECT
, чтобы предложение ORDER BY
могло использовать его для сортировки. Используйте следующий запрос:
SELECT YEAR(sys_date) as ysysdate,
MONTH(sys_date) as msysdate,
DATE_FORMAT(sys_date, "%Y-%c") as ymonth,
COUNT(*)
FROM sale
GROUP BY ymonth
ORDER BY ysysdate ASC, msysdate ASC
@ S.Sandeep Привет, какая у вас версия mysql? не могли бы вы также привести несколько примеров данных!
И тебе привет. Версия MySQL - 5.7.23.
невозможно предоставить образцы данных, так как таблица слишком велика.
@ S.Sandeep Я отредактировал запрос. пожалуйста, проверьте отредактированный ответ. По-видимому, year_month - зарезервированное ключевое слово в mysql, поэтому я не мог принять его как псевдоним, если не использовал `
Выражение № 1 предложения ORDER BY отсутствует в предложении GROUP BY и содержит неагрегированный столбец global_sys_copy.sale.sys_date, который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by
Ok. у вас включен режим only_full_group_by. Редактирование за секунду, чтобы справиться с этим
@ S.Sandeep, пожалуйста, проверьте отредактированный запрос. Это должно сработать. Хотя предыдущий у меня работал нормально, потому что обычно режим only_full_group_by
не включен.
После изменения запроса ВЫБЕРИТЕ ГОД (sys_date) как ysysdate, МЕСЯЦ (sys_date) как msysdate, DATE_FORMAT (sys_date, "% Y-% c") как ymonth, COUNT (*) FROM sale GROUP BY ymonth, msysdate, ysysdate ORDER ПО ysysdate ASC, msysdate ASC Это сработало
@ S.Sandeep Отлично! Я также добавил объяснение для вашего понимания. Вы можете проголосовать за ответ или принять его. Благодарность :)
Это потому, что вычисленный month
упорядочен в алфавитном порядке. Но вы можете оставить этот ORDER BY month
и просто изменить его на формат с ведущим 0 в течение месяцев <10.
Таким образом, все строковые значения будут иметь одинаковую длину, а сортировка по алфавиту будет правильной.
Потому что при сравнении строк тогда '10' <'9', но '09' <'10'
Для этого просто замените %c
на %m
. Ссылка
Также COUNT
можно упростить.
SELECT DATE_FORMAT(sys_date, '%Y-%m') as month, COUNT(*) as Total
FROM sale
GROUP BY month
ORDER BY month
Если вы все же хотите использовать формат "% Y-% c"?
Затем вы можете включить год и продолжительность месяца в ORDER BY.
SELECT DATE_FORMAT(sys_date, '%Y-%c') as month, COUNT(*) as Total
FROM sale
GROUP BY YEAR(sys_date), month
ORDER BY YEAR(sys_date), LENGTH(month), month
У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии вашего сервера MySQL, чтобы найти правильный синтаксис для использования около 'year_month, COUNT (DATE_FORMAT (sys_date,'% Y-% c ')) FROM sale GROUP BY year_month' в строке 1