Сортировка DATE_FORMAT "% Y-% c" в ASC

У меня есть запрос

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 и многие другие варианты, перечисленные на сайте. Но вроде ничего не работает.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
163
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Сортировка данных на основе ГОД и МЕСЯЦ, полученных напрямую от 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

У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии вашего сервера MySQL, чтобы найти правильный синтаксис для использования около 'year_month, COUNT (DATE_FORMAT (sys_date,'% Y-% c ')) FROM sale GROUP BY year_month' в строке 1

S. Sandeep 09.09.2018 11:06

@ S.Sandeep Привет, какая у вас версия mysql? не могли бы вы также привести несколько примеров данных!

Madhur Bhaiya 09.09.2018 11:07

И тебе привет. Версия MySQL - 5.7.23.

S. Sandeep 09.09.2018 11:09

невозможно предоставить образцы данных, так как таблица слишком велика.

S. Sandeep 09.09.2018 11:10

@ S.Sandeep Я отредактировал запрос. пожалуйста, проверьте отредактированный ответ. По-видимому, year_month - зарезервированное ключевое слово в mysql, поэтому я не мог принять его как псевдоним, если не использовал `

Madhur Bhaiya 09.09.2018 11:11

Выражение № 1 предложения ORDER BY отсутствует в предложении GROUP BY и содержит неагрегированный столбец global_sys_copy.sale.sys_date, который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by

S. Sandeep 09.09.2018 11:13

Ok. у вас включен режим only_full_group_by. Редактирование за секунду, чтобы справиться с этим

Madhur Bhaiya 09.09.2018 11:14

@ S.Sandeep, пожалуйста, проверьте отредактированный запрос. Это должно сработать. Хотя предыдущий у меня работал нормально, потому что обычно режим only_full_group_by не включен.

Madhur Bhaiya 09.09.2018 11:17

После изменения запроса ВЫБЕРИТЕ ГОД (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 09.09.2018 11:21

@ S.Sandeep Отлично! Я также добавил объяснение для вашего понимания. Вы можете проголосовать за ответ или принять его. Благодарность :)

Madhur Bhaiya 09.09.2018 11:22

Это потому, что вычисленный 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

Другие вопросы по теме