Это сложная проблема с отчетностью.Функция GROUP_CONCAT
может делать то, что вы хотите, но для этого потребуется уже иметь таблицу с городами и их общим количеством, за месяц и год, или странами и их общим количеством.Таким образом, один из подходов состоит в том, чтобы выполнить объединение, сначала агрегируя по году, месяцу и городу / стране, а затем снова агрегируя только по году и месяцу, чтобы получить нужный отчет CSV.
SELECT
t1.year,
t1.month,
t1.cities,
t2.countries
FROM
(
SELECT
year,
month,
GROUP_CONCAT(t.city_label, '(', CAST(t.cnt AS CHAR(50)), ')') cities
FROM
(
SELECT
YEAR(time_visit) year,
MONTH(time_visit) month,
CONCAT(country, '-', city) AS city_label,
COUNT(*) AS cnt
FROM table_visitor
GROUP BY YEAR(time_visit), MONTH(time_visit), CONCAT(country, '-', city)
) t
GROUP BY year, month
) t1
INNER JOIN
(
SELECT
year,
month,
GROUP_CONCAT(t.country, '(', CAST(t.cnt AS CHAR(50)), ')') countries
FROM
(
SELECT YEAR(time_visit) year, MONTH(time_visit) month, country, COUNT(*) AS cnt
FROM table_visitor
GROUP BY YEAR(time_visit), MONTH(time_visit), country
) t
GROUP BY
year, month
) t2
ON t1.year = t2.year AND t1.month = t2.month
GROUP BY
t1.year,
t1.month;
Демо
Обратите внимание, что в моем выводе я имею в виду города, используя как город, так и название страны.Причиной этого является то, что данное название города не может быть уникальным в разных странах.Например, в американском штате Огайо есть город под названием Лондон, поэтому использование Лондона в отчете может быть неоднозначным.
Если вы хотите упорядочить данные CSV в столбцах города или страны, посмотритеиспользуя ORDER BY
с GROUP_CONCAT
.
Редактировать:
Из ваших комментариев ниже видно, что у вас может быть действительно большая таблица, и, кроме того, что выможет потребоваться запустить этот отчет часто в производстве.Я бы предложил вам разбить отчет на части.Например, вы можете запустить процесс, который использует вышеупомянутый запрос в конце каждого года / месяца.Затем он может вставить запись о результате в предложенную вами таблицу visitor_summary
.Таким образом, на производство не повлияло бы то, что ему пришлось бы сразу разбить всю историческую таблицу.