Простой запрос PIVOT выдает сообщение об ошибке

0

Я использую следующий 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

Вы знаете, где ошибка в моем запросе?

  • 2
    MySQL не имеет функцию поворота
  • 0
    На какой версии mysql вы работаете?
Показать ещё 3 комментария
Теги:

2 ответа

0
Лучший ответ

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;
1

В MySQL у вас нет функции PIVOT.

Если вы можете использовать альтернативные способы со значениями SUM для соединения.

Хороший пример вы найдете в ЭТОЙ ССЫЛКЕ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню