Я использую следующий SQL для получения посещений из нашей базы данных:
SELECT
t.country, MONTH(visit_date), t.visits
FROM
visits t
WHERE
t.visit_date BETWEEN '2017-01-01' AND '2017-12-31'
ORDER BY
t.country
Результат этого запроса выглядит так:
Country Month Visits
-------------------------------
DE 1 5.000
DE 2 6.000
: : :
: : :
US 1 5.400
US 2 3.000
: : :
: : :
Все это прекрасно работает.
Теперь я хочу повернуть результат, чтобы в конце он выглядел так:
1 2 3 4
DE 10.000 15.000 30.000 20.000
US 20.220 18.400 40.000 19.000
Поэтому я попытался использовать следующий SQL:
SELECT
*
FROM
(SELECT t.country, MONTH(visit_date), t.visits
FROM visits t
WHERE t.visit_date BETWEEN '2017-01-01' AND '2017-12-31'
ORDER BY t.country) AS s
PIVOT
(SUM(t.visits)
FOR MONTH(t.visit_date) IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
) AS pvt
Однако этот запрос вызывает ошибку:
Код ошибки: 1064. У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера БД, для правильного синтаксиса для использования рядом с "PIVOT (SUM (t.unique_visits) FOR MONTH (t.visit_date) IN (1, 2, 3, 4, 5, 6, 7, в строке 7
Вы знаете, где ошибка в моем запросе?
MySQL не предоставляет функцию PIVOT
. Вам придется строить сводную таблицу самостоятельно. Обычно используемый способ сделать это conditional aggregation
.
Вы можете изменить свой запрос таким образом, чтобы получить желаемый результат.
SELECT
country,
SUM(CASE WHEN month = 1 THEN visits END) AS '1',
SUM(CASE WHEN month = 2 THEN visits END) AS '2',
SUM(CASE WHEN month = 3 THEN visits END) AS '3',
SUM(CASE WHEN month = 4 THEN visits END) AS '4'
FROM
(SELECT
t.country, MONTH(visit_date) month, t.visits
FROM visits t
WHERE t.visit_date BETWEEN '2017-01-01' AND '2017-12-31'
ORDER BY t.country) AS s
GROUP BY country;
В MySQL у вас нет функции PIVOT.
Если вы можете использовать альтернативные способы со значениями SUM для соединения.
Хороший пример вы найдете в ЭТОЙ ССЫЛКЕ