2016-06-07 81 views
1

我有一个包含严重性和过时标志的各种值的警报表,它们都是int。将SQL MAX限制为匹配WHERE子句的行

我试图建立一个CASE语句,它将返回最低严重性(1),如果所有都过时并获得最大严重性,如果有非过时警报没有过时。

过时将只会是0或1,所以如果总数和所有警报的计数是相同的,他们都是过时的,我有问题与其他案件(其中有些是过时的,但其他人不是并忽略过时的严重程度)。

这似乎是简单的东西,如下面应该工作:

(CASE 
    WHEN (SUM(`al`.`OBSOLETE`) = COUNT(`al`.`ALARM_ID`)) THEN MIN(`al`.`SEVERITY`) 
    ELSE (MAX(`al`.`SEVERITY`) WHERE `al`.`OBSOLETE` != 1) 
END) AS `overallSeverity`, 

但我得到的错误:

Syntax error: missing 'closing parenthesis'

下面的工作是有效的SQL但即使返回最大已过时:

(CASE 
    WHEN (SUM(`al`.`OBSOLETE`) = COUNT(`al`.`ALARM_ID`)) THEN MIN(`al`.`SEVERITY`) 
    ELSE (MAX(`al`.`SEVERITY`)) 
END) AS `overallSeverity`, 

基本上,我该如何获得不包括垫的行的最大值在哪里?

+0

你不能在你的字段选择中声明一个WHERE。尝试构建子查询 – etalon11

回答

2

子查询等来评价需要至少SELECTFROM条款:

(CASE 
    WHEN (SUM(`al`.`OBSOLETE`) = COUNT(`al`.`ALARM_ID`)) 
    THEN MIN(`al`.`SEVERITY`) 
    ELSE (SELECT MAX(`al`.`SEVERITY`) FROM tablename WHERE `al`.`OBSOLETE` != 1) 
END) AS `overallSeverity`, 

与任何表的名称替换tablename d。

+0

起初,这仍然无视过时,但将= =更改为<>似乎为我工作,谢谢! –

1

你应该在具有状态,而不是在使用聚合功能(总和,最大值,最小值,平均值..),其中

select ....... 
from ... 
where 
having (CASE 
    WHEN (SUM(`al`.`OBSOLETE`) = COUNT(`al`.`ALARM_ID`)) THEN MIN(`al`.`SEVERITY`) 
    ELSE (MAX(`al`.`SEVERITY`)) 
    END) 

聚集结果只能在具有子句