Создание сводной таблицы с изменением дат в MySQL

0

Поэтому я пытаюсь создать сводную таблицу с 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 |
  • 0
    Какой день начинается с 3 day increments. ?
  • 0
    Сообщить об этом два раза в неделю. Понедельник, который охватывает вс, субботу, пятницу, а затем я запускаю четверг на понедельник, вторник, среду
Показать ещё 2 комментария
Теги:
pivot
pivot-table

1 ответ

0

Динамические сводные таблицы в 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 |
+-----------+------------+------------+------------+-------------+
  • 0
    не уверен, что вы имеете в виду, отправив его обратно.
  • 0
    Выдает запрос; вы берете этот запрос и запускаете его.
Показать ещё 1 комментарий

Ещё вопросы

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