如果一行符合特定条件,则汇总行

时间:2015-09-04 12:31:02

标签: mysql sql conditional-statements

我尝试选择isOK列中每个Name分隔的值的总和,但仅在isOK = 1 Day = 2上时{/ 1}}。

以下示例表tablename

的查询
Name | Day | isOK  
char | int | int   
-----------------
Flo  |   1 |    1  
Seb  |   1 |    1  
Tim  |   1 |    0  
Flo  |   2 |    1  
Seb  |   2 |    0  
Tim  |   2 |    1  

应该给Flo:2和Tim:1,但不是Seb:1,因为他isOK上的Day = 2是0.

我尝试过使用带有IF构造的SUM(isOK),但它只是不起作用。我的替代解决方案是,首先选择Name = 1并且为每个名称选择SUM(isOK)的所有isOK都很慢,似乎需要改进。

我想这并不困难,但我现在已经尝试了几个小时,我只能将我的两个查询合并为一个。

3 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是将条件表达式与having子句一起使用,如下所示:

select name, sum(isOk) ok_sum
from your_table
group by name
having sum(case when day = 2 and isOK = 1 then 1 else 0 end) > 0;

使用您的样本数据,结果将是:

name    ok_sum
Flo     2
Tim     1

当MySQL将布尔表达式计算为1或0时,应该可以将条件减少到:

having sum(day = 2 and isOK = 1) > 0;

另一种方法是使用相关子查询,确保Day = 2存在isOk = 1Name行:

select t1.name, sum(t1.isOk) ok_sum
from your_table t1
where exists (
    select 1 
    from your_table t2
    where t2.day = 2 and t2.isOK = 1 and t1.name = t2.name
) 
group by t1.name

答案 1 :(得分:0)

尝试这个:

SELECT 
    name, SUM(isok) AS isOk
FROM
    table
GROUP BY `name`
HAVING SUM(`day` = 2 AND isok = 1) > 0; 

答案 2 :(得分:0)

SELECT x.name, SUM(y.isOK) total
  FROM my_table x
  JOIN my_table y
    ON y.name = x.name
 WHERE x.day = 2
   AND x.isok=1
 GROUP
    BY x.name;
相关问题