Поэтому я пытаюсь создать сводную таблицу с SQL-запросом. В настоящее время я делаю этот процесс в листах, но хотел бы сделать его немного менее болезненным.
ip domain type date provider type_of_event number_of_events
999 mail.com normal 2018-08-31 orange abuse 12
999 mail1.com normal 2018-08-30 orange abuse 11
999 mail1.com normal 2018-08-29 orange abuse 13
999 mail.com normal 2018-08-31 orange abuse 10
И я хотел бы, чтобы это было так
Domain 2018-08-29 2018-08-30 2018-08-31 Grand Total
mail.com 22 22
mail1.com 13 11 24
У меня возникла проблема с форматированием, так как большинство примеров, которые я нахожу, имеют стационарные поля, а затем даты всегда меняются, но мне нужно отображать текущее поле, над которым работает. Который всегда будет с шагом в 3 дня. Мне нужно также ссылаться на type_of_event, поскольку в примере показан только один тип, но у меня есть несколько в этой же базе данных.
Этот вопрос отличается от других, поскольку у меня нет нескольких таблиц, из которых эти данные поступают. Все эти данные находятся в одной таблице. Я не вижу, как поможет сводное соединение, когда мне не к чему присоединиться?
Итак, используя это
SELECT CONCAT('SELECT
domain,
SUM(number_of_events * (date_of_event = CURRENT_DATE() - INTERVAL 3 DAY))
AS '', CURRENT_DATE() - INTERVAL 3 DAY, '',
SUM(number_of_events * (date_of_event = CURRENT_DATE() - INTERVAL 2 DAY))
AS '', CURRENT_DATE() - INTERVAL 2 DAY, '',
SUM(number_of_events * (date_of_event = CURRENT_DATE() - INTERVAL 1 DAY))
AS '', CURRENT_DATE() - INTERVAL 1 DAY, '',
SUM(number_of_events) AS 'Grand Total'
FROM signal_spam
GROUP BY domain;'
) AS theQuery;
Дает мне
+----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-
-----------------------------------------------------------------------------
-
-----------------------------------------------------------------------------
-
-----------------------------------------------------------------------------
-
----------------+
| theQuery
|
+----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
----------------+
| SELECT
domain,
SUM(number_of_events * (date_of_event = CURRENT_DATE() - INTERVAL 3 DAY))
AS '2018-09-11',
SUM(number_of_events * (date_of_event = CURRENT_DATE() - INTERVAL 2 DAY))
AS '2018-09-12',
SUM(number_of_events * (date_of_event = CURRENT_DATE() - INTERVAL 1 DAY))
AS '2018-09-13',
SUM(number_of_events) AS 'Grand Total'
FROM signal_spam
GROUP BY domain; |
+----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-
----------------------------------------------------------------------------
--
-----------------------------------------------------------------------------
-
-----------------------------------------------------------------------------
-
----------------+
1 row in set (0.00 sec)
Если я удаляю concat, я не получаю счет в строках, просто общая сумма, и ни одна дата не указана
+------------------------------------+---------------------------------------
+---------------------------------------+------------------------------------
-
--+-------------+
| domain | ', CURRENT_DATE() - INTERVAL 3 DAY, '
|
', CURRENT_DATE() - INTERVAL 2 DAY, ' | ', CURRENT_DATE() - INTERVAL 1 DAY, '
| Grand Total |
+------------------------------------+---------------------------------------
+---------------------------------------+------------------------------------
-
--+-------------+
| 0.pool. | 0
|
0 | 0 | 258 |
| 143.com | 0
|
0 | 0 | 2 |
Динамические сводные таблицы в MySQL обычно выполняются путем записи запроса, который затем генерирует строку SQL.
SELECT CONCAT('
SELECT
domain,
SUM(number_of_events * (date = CURRENT_DATE() - INTERVAL 3 DAY))
AS '', CURRENT_DATE() - INTERVAL 3 DAY, '',
SUM(number_of_events * (date = CURRENT_DATE() - INTERVAL 2 DAY))
AS '', CURRENT_DATE() - INTERVAL 2 DAY, '',
SUM(number_of_events * (date = CURRENT_DATE() - INTERVAL 1 DAY))
AS '', CURRENT_DATE() - INTERVAL 1 DAY, '',
SUM(number_of_events) AS 'Grand Total'
FROM tableName
GROUP BY domain;'
) AS theQuery;
Возьмите результат этого запроса и отправьте его обратно в MySQL.
Например, запуск этого запроса сегодня производит:
SELECT
domain,
SUM(number_of_events * (date = CURRENT_DATE() - INTERVAL 3 DAY))
AS '2018-09-11',
SUM(number_of_events * (date = CURRENT_DATE() - INTERVAL 2 DAY))
AS '2018-09-12',
SUM(number_of_events * (date = CURRENT_DATE() - INTERVAL 1 DAY))
AS '2018-09-13',
SUM(number_of_events) AS 'Grand Total'
FROM signal_spam
GROUP BY domain;
Там запрос сводной таблицы, динамически генерируемый MySQL. Теперь просто скопируйте/вставьте этот запрос обратно в клиент и окончательный результат:
+-----------+------------+------------+------------+-------------+
| domain | 2018-09-11 | 2018-09-12 | 2018-09-13 | Grand Total |
+-----------+------------+------------+------------+-------------+
| mail.com | 0 | 0 | 22 | 22 |
| mail1.com | 13 | 11 | 0 | 24 |
+-----------+------------+------------+------------+-------------+
3 day increments.
?