Дана таблица 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.
Я могу написать запрос для получения отдельных столбцов, но когда я объединяю их вместе, я получаю ошибки с групповыми столбцами.
Вот мой запрос:
select concat('Q', Quarter(dt), "'", RIGHT(YEAR(dt), 2)) as c1
from events
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






Включите год в группировку подзапроса.
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 в этом запросе?
Это оператор модуля, он получает остаток при делении на 100, то есть получает последние две цифры года.
Но я только что понял, что это неправильно, потому что в 2001-2009 годах это не будет правильным решением.
Данные
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
Пожалуйста, добавьте образец ввода и желаемый результат.