【问题标题】:Creating a pivot table with changing dates in MySQL在 MySQL 中创建具有更改日期的数据透视表
【发布时间】: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


【解决方案1】:

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 |
+-----------+------------+------------+------------+-------------+

【讨论】:

  • 不知道你把它送回去是什么意思。上面的游戏我
  • 它产生一个查询;你接受那个查询并运行它。
  • 刚刚添加了我在上面看到的内容
猜你喜欢
  • 2023-01-10
  • 2013-12-02
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多