【发布时间】:2018-09-14 18:44:39
【问题描述】:
所以我正在尝试使用 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 |
【问题讨论】:
-
3 day increments.是哪一天开始的? -
报告它每周运行两次。星期一,包括星期日、星期六、星期五,然后我在星期四运行它的星期一、星期二、星期三
-
您尚未指定要如何引用 type_of_event。您想为每种事件类型设置单独的列吗?单独的行?
-
我可以对每种类型的事件进行排序。最终,这将是一个 php 类型的工作,其中有一个变量。所以只是寻找格式
标签: mysql pivot pivot-table