SQL COUNT查询类似于UNION但结果为多列

时间:2014-11-26 09:17:23

标签: 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   |

非常欢迎任何建议。

由于

2 个答案:

答案 0 :(得分:0)

为(根据需要)创建一个单独的表:

+ ------ + ------- + ------ + |小时|声音|数据| + ------ + ------- + ------ +

并使用触发器每小时更新一次。

答案 1 :(得分:0)

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

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)