Использование group_concat дает ошибку при группировке столбцов

Дана таблица events со столбцами dt (timestamp) и type (event type, example buy, sell, other).

Я хочу получить все события, произошедшие в 2021, в Quarter мудрости.

Результат должен содержать 2 столбца:

  • столбец 1 = номер квартала, за которым следует одинарная кавычка, а затем последние 2 цифры года. пример Q1'21, Q2'21, Q3'21, Q4'21

  • столбец2 = Формат: ##=##, первый ## указывает тип события, а следующий # указывает общее количество событий этого конкретного типа.

    • Разделяйте типы точкой с запятой и пробелом.
    • Отсортируйте это по убыванию общего количества событий, а затем по возрастанию типа.
  • Отсортируйте результаты в порядке возрастания столбца1.

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

Вот мой запрос:

  • Чтобы получить столбец 1:
select concat('Q', Quarter(dt), "'", RIGHT(YEAR(dt), 2)) as c1 
from events
  • Чтобы получить столбец2:
select group_concat(concat(type, '=', cnt)) as c2 
from (
    select type, count(*) as cnt, quarter(dt) as qtr
    from events where year(dt) = 2021 
    group by type, qtr

Каков правильный способ решить эту проблему?

образец ввода:

2021-02-10 12:10:32    sell
2021-01-10 01:10:32    buy
2021-03-10 13:10:32    other
2021-11-10 13:10:32    buy
2021-12-10 13:10:32    sell

пример вывода:

Q1'21    buy=1; other=1; sell=1
Q4'21    buy=1; sell=1

Пожалуйста, добавьте образец ввода и желаемый результат.

Barmar 23.05.2024 18:08
Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Включите год в группировку подзапроса.

SELECT CONCAT(q, "'", y) AS c1, GROUP_CONCAT(type, '=', cnt ORDER BY cnt DESC, type) AS c2
FROM (
    SELECT type, QUARTER(dt) AS q, RIGHT(YEAR(dt), 2) AS y, COUNT(*) AS cnt
    FROM events
    GROUP BY type, y, q
)
GROUP BY c1

Обратите внимание, что нет необходимости использовать CONCAT() внутри GROUP_CONCAT(), он автоматически объединяет все аргументы.

Спасибо, какой смысл использовать % 100 в этом запросе?

Learner 23.05.2024 18:30

Это оператор модуля, он получает остаток при делении на 100, то есть получает последние две цифры года.

Barmar 23.05.2024 18:33

Но я только что понял, что это неправильно, потому что в 2001-2009 годах это не будет правильным решением.

Barmar 23.05.2024 18:34

Данные

CREATE TABLE YOURTABLE(
   date   DATETIME   NOT NULL 
  ,opinon VARCHAR(80) NOT NULL
);
INSERT INTO YOURTABLE
(date,opinon) VALUES 
('2021-02-10 12:10:32','sell'),
('2021-01-10 01:10:32','buy'),
('2021-03-10 13:10:32','other'),
('2021-11-10 13:10:32','buy'),
('2021-12-10 13:10:32','sell');

используйте subquery, concat, Group_concat и right следующим образом

SELECT date1,
       Group_concat(opinon ORDER BY date1 SEPARATOR ';') OPINION
FROM   (SELECT Concat('Q', Quarter(date), '''', RIGHT(Year(date), 2)) DATE1,
               Concat(opinon, '=1')                                   opinon
        FROM   yourtable) A
GROUP  BY date1  

dbfiddle

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