一尘不染

两个SQL COUNT()查询?

sql

我想同时计算一个表中的记录总数和符合某些条件的记录总数。我可以使用两个单独的查询来完成这些操作:

SELECT COUNT(*) AS TotalCount FROM MyTable;
SELECT COUNT(*) AS QualifiedCount FROM MyTable
  {possible JOIN(s) as well e.g. JOIN MyOtherTable mot ON MyTable.id=mot.id} 
  WHERE {conditions};

有没有一种方法可以将它们组合成一个查询,以便在一行中得到两个字段?

SELECT {something} AS TotalCount, 
  {something else} AS QualifiedCount 
  FROM MyTable {possible JOIN(s)} WHERE {some conditions}

如果没有,我可以发出两个查询并将它们包装在一个事务中,以便它们保持一致,但是我希望使用一个查询来完成。

编辑:我最关心原子性;如果需要两个子SELECT语句就可以,只要某个地方有INSERT,它就不会使两个响应不一致。

编辑2:CASE答案很有帮助,但在我的特定情况下,条件可能包括与另一个表的JOIN(对不起,在我的原始帖子中没有提及,对不起),所以我猜测这种方法行不通。


阅读 178

收藏
2021-03-10

共1个答案

一尘不染

一种方法是将表与自身连接:

select
   count(*) as TotalCount,
   count(s.id) as QualifiedCount
from
   MyTable a
left join
   MyTable s on s.id = a.id and {some conditions}

另一种方法是使用子查询:

select
   (select count(*) from Mytable) as TotalCount,
   (select count(*) from Mytable where {some conditions}) as QualifiedCount

或者,您可以将条件放在一个案例中:

select
   count(*) as TotalCount,
   sum(case when {some conditions} then 1 else 0 end) as QualifiedCount
from
   MyTable
2021-03-10