如何计算 sql 中所有行都已批准?

how to count all rows are approved in sql?

我有这条线路数据,其中还显示了状态:approved, in progress, not yet started。 我需要根据线条颜色来计算有多少行是 ALL APROVED。

数据类似这样:

line    color       status
1       red      not yet started
2       red       approved
3       green     approved
4       green     approved
5       green     approved

查询应该显示只有颜色(绿色)表示所有状态都已批准,因为红色仍然具有“尚未开始”状态。

我试过了

select color count(line) from table 1 where status = 'approved' group by color

它仍然给我 2 种颜色被批准,而我预计只有一种。

我应该如何解决我的查询?

谢谢。

您可以使用 group byhaving:

select color, count(*) cnt
from mytable
group by color
having min(status) = max(status) and min(status) = 'approved'

having子句确保组中只有一个不同的值,其值为'approved'.

在 MySQ 中,您还可以像这样表达 having 子句:

having max(status <> 'approved') = 0

或者简单地说:

having not max(status <> 'approved')

如果你真的想要统计全部通过的颜色数,可以使用这个方法:

select (count(distinct color) -
        count(distinct case when status <> 'approved' then color end)
       )
from t;

这会计算您 table 中的颜色数量,然后减去具有非“已批准”状态的颜色数量。

另一种方法(获取行数等于批准行数的颜色):

select color 
from tbl 
group by color
having count(*) = count(case when status = 'approved' then status end);

这里是fiddle