mysql - SQL COUNT 查询类似于 UNION 但结果在多个列中

标签 mysql sql

我有一个根据 DHCPD 日志构建的单表 SQL 数据库,结构如下:

+------+-------+------+----------+---------+-------------------+-----------------+
| id   | Month | Day  | Time     | Type    | MAC               | ClientIP        |
+------+-------+------+----------+---------+-------------------+-----------------+
| 9305 | Nov   |   24 | 03:20:00 | DHCPACK | 00:04:f2:4b:dd:51 | 10.123.246.116  |
| 9307 | Nov   |   24 | 03:20:07 | DHCPACK | 00:04:f2:99:4c:ba | 10.123.154.176  |
| 9310 | Nov   |   24 | 03:20:08 | DHCPACK | 00:19:bb:cf:cd:28 | 10.99.107.3     |
| 9311 | Nov   |   24 | 03:20:08 | DHCPACK | 00:19:bb:cf:cd:28 | 10.99.107.3     |

日志中的每个 DHCP 事件最终都会进入该数据库,因此任何时间点的事件都可能用于构建图表。为了利用数据进行绘图,我需要能够创建一个包含多个列的输出表,但其值是从与特定模式匹配的单列中的计数得出的。

我设法想出的最接近的东西是这个查询:

select 'Data' as ClientIP, count(*) from Log where ClientIP like '10.99%' and MAC like '00:04:f2%'
union
select 'Voice' as ClientIP, count(*) from Log where ClientIP like '10.123%' and MAC like '00:04:f2%';

这会产生以下结果:

+-----------+-------+
| ClientIP  | Count |
+-----------+-------+
| Data      |  4618 |
| Voice     | 13876 |
+-----------+-------+

对于一次性查询来说很好,但我想将这两行转换为两列,然后每小时运行一行相同的查询(例如)。我想要这样的东西:

+------+-------+------+
| Hour | Voice | Data |
+------+-------+------+
|  03  |  22   |  4   |
|  04  | 123   | 23   |
|  05  |  45   |  5   |

非常欢迎任何建议。

谢谢

最佳答案

您可以按小时分组并使用条件计算来计算数据和语音流量。 例如:

SELECT 
HOUR(time) AS `Hour`, 
SUM(CASE WHEN ClientIP like '10.99%' and MAC like '00:04:f2%' THEN 1 ELSE 0 END) AS `Data`,
SUM(CASE WHEN ClientIP like '10.123%' and MAC like '00:04:f2%' THEN 1 ELSE 0 END) AS `Voice`
FROM log
GROUP BY HOUR(time)

关于mysql - SQL COUNT 查询类似于 UNION 但结果在多个列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27145248/

相关文章:

php - 如何在mysql数据库中管理酒店预订系统的库存表

sql - 外键中的空值

MYSQL主键组合2个唯一且不相同的值

MySQL世界数据库sql文件插入数据时出现语法错误

php - 为什么我们必须在查询命令后关闭 MySQL 数据库?

mysql - 使用 group by 时结果为 0 时不会显示 Count(*)

php mysql 未选择表

c# - 运行一个字符串作为构建电子邮件的指令

java - Hibernate 与附加表的多对多关系

mysql - 选择用户在 mysql 中有多个不同的记录