如何计算 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 by
和 having
:
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
我有这条线路数据,其中还显示了状态: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 by
和 having
:
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