选择distinct列,然后计算与MySQL

时间:2017-06-16 20:25:14

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

The query is interpreting UIView *menuView; - (void)viewDidLoad { [super viewDidLoad]; CGFloat height = [UIScreen mainScreen].bounds.size.height; menuView = [[CustomMenuView alloc]initWithFrame:CGRectMake(0, 60, 135, height)]; [self.view addSubview:menuView]; } as string, try using ` or double quotes to delimit the field instead. ...and while it is "standard", I tend to shy away from double-quotes because they look like they should be for strings (and in some configurations of MySQL are).

Edit (for clarity): I mean it is literally interpreting 'EVENT_SEVERITY' as the string "EVENT_SEVERITY", not the underlying value of the field as a string.

答案 1 :(得分:0)

你非常接近。

DISTINCT在您进行分组时是不必要的。

你想要SUM()COUNT()只会计算所有不为空的内容。您可以利用布尔表达式求值为1或0的hack。

 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(*)之类的批量总计通常是一种很好的做法,尤其是在您进行调试时;它们形成了良好的健全性检查,您可以正确处理数据。