计算总条件和真实条件线

时间:2012-06-30 11:37:12

标签: mysql sql postgresql

如何计算表格中的行数和某个条件为真的行数,而不依赖于这样的子选择:

create table t (a integer);
insert into t (a) values (1), (2), (null);

select
    (select count(*) from t) as total_lines,
    (select count(*) from t where a = 1) as condition_true
;
 total_lines | condition_true 
-------------+----------------
           3 |              1

3 个答案:

答案 0 :(得分:4)

select count(*) as total_lines, count(a = 1 or null) as condition_true
from t
;
 total_lines | condition_true 
-------------+----------------
           3 |              1

它的工作原因是:

首先count(*)计算所有行数,count(my_column)只计算my_column不为空的行:

select count(a) as total
from t
;
 total 
-------
     2

第二个(false or null)会返回null,因此,只要我的条件不符合,它就会返回null并且不会被count(condition or null)计算,而{{1}}只计算非空值。

答案 1 :(得分:2)

使用SUM(condition)

select
    count(*) as total_lines,
    sum(a = 1) as condition_true
from t

看到它正常工作here

这是有效的,因为在mysql中,true1false0,因此条件的sum()将添加1当它为真时0当它为假时 - 它实际上计算条件为真的次数。

许多人错误地认为你需要一个case语句,但你没有使用mysql(你使用其他一些数据库)

答案 2 :(得分:2)

这可以使用条件内部计数轻松完成。我不知道它是否是优化的方法,但它完成了工作

您可以按照以下方式执行此操作

select count(*) as total_lines, COUNT(CASE WHEN a = 1 THEN 1 END) as condition_true from t

你可以在这里查看

sqlFiddle