我有一个根据 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/