mysql - 选择不同的列,然后计算与 MySQL 中该列相关的 2 列

标签 mysql sql database

所以我有一个错误日志需要分析。

在那个错误日志中有一些字段叫做

  • EVENT_ATTRIBUTE,显示收集该信息的设备的名称。
  • EVENT_SEVERITY,显示从 1 到 5 的数字。在此列中,我需要找到 4 和 5 的数量。

问题是我需要获得不同的 EVENT_ATTRIBUTES,然后计算与该特定 EVENT_ATTRIBUTE 相关的所有 4 和 5,并输出计数。

基本上传感器(event_attribute)检测不同的错误。我需要分析每个传感器接收到多少个 4 和 5,以便我可以分析它们。

我在使用不同的传感器并将它们链接到特定传感器时遇到问题。到目前为止我已经尝试过了,但它只返回相同的数字 4 和 5,所以我认为我做的不正确。

SELECT DISTINCT LEFT(EVENT_ATTRIBUTE, locate('(', EVENT_ATTRIBUTE, 1)-1) AS 
SensorName, 
COUNT(CASE WHEN 'EVENT_SEVERITY' <>5 THEN 1 END) AS ERROR5,
COUNT(CASE WHEN 'EVENT_SEVERITY' <>4 THEN 1 END) AS ERROR4
FROM nodeapp.disc_event
WHERE EVENT_SEVERITY IN (5,4)
Group BY SensorName;

这是我正在查看的表格。 Event Error Table

我正在截断事件属性,因为 IP 地址无关紧要。基本上我想让唯一的 event_attribute 充当主键并计算连接到该主键的 4 和 5 的数量。

使用上面的代码我得到了这个输出:Event Result Table

谢谢大家的帮助!

最佳答案

你非常接近。

DISTINCT 在分组时是不必要的。

您需要 SUM()COUNT() 只计算非空的所有内容。您可以利用 bool 表达式计算结果为 1 或 0 的技巧。

 SELECT LEFT(EVENT_ATTRIBUTE, LOCATE('(', EVENT_ATTRIBUTE, 1)-1) AS SensorName, 
        SUM(EVENT_SEVERITY = 5) ERROR_5,
        SUM(EVENT_SEVERITY = 4) ERROR_4,
        COUNT(*) ALL_ERRORS
   FROM nodeapp.disc_event
  GROUP BY LEFT(EVENT_ATTRIBUTE, LOCATE('(', EVENT_ATTRIBUTE, 1)-1);

即使 EVENT_SEVERITY 值在您的 DBMS 中存储为字符串,EVENT_SEVERITY = 4 等表达式也会隐式地将它们强制转换为整数。

包含批处理总计(如 COUNT(*))通常是一种很好的做法,尤其是在调试时;它们可以很好地检查您是否正确处理数据。

关于mysql - 选择不同的列,然后计算与 MySQL 中该列相关的 2 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44597446/

相关文章:

MySQL Pivot 将记录转为列出所有数据的列

php - 在查询中连接或循环结果

mysql - 限制行数之间的sql查询性能差异

PHP foreach 输出所有内容四次(mysql、sql、数据库管理)

python - 如何阻止 Django 服务器继续加载?

sql - 表中每天的值总和

sql - 如何在SSIS中同步两个表

c# - 从 .Net 应用程序处理 MySql 数据库的正确方法是什么

php - SQL 查询检索连续特定日期的价格总和

sql - Oracle sql - join 和 group by 子句提取订单最多的顶级客户