我正在尝试为每个分隔的 Name
选择 isOK
列中值的总和,但前提是 isOK = 1
Day = 2
。
以下示例表的查询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,因为他在 Day
= 2 的 isOK
是 0。
我尝试过将 SUM(isOK) 与 IF 结构一起使用,但它不起作用。我的替代解决方案是先选择所有 Name
其中 isOK
= 1,然后为每个名称选择 SUM(isOK),速度很慢,似乎需要改进。
我想这并不是那么困难,但我已经尝试了几个小时了,但我无法将我的两个查询合并为一个。
最佳答案
实现此目的的一种方法是将条件表达式与 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 将 bool 表达式计算为 1 或 0,因此应该可以将条件简化为:
having sum(day = 2 and isOK = 1) > 0;
另一种方法是使用相关子查询,确保存在 Name 包含
:Day = 2
和 isOk = 1
的行
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
关于mysql - 如果一行满足特定条件则聚合行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32398156/