mysql - 如果一行满足特定条件则聚合行

标签 mysql sql conditional-statements

我正在尝试为每个分隔的 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 = 2isOk = 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/

相关文章:

java - 本地主机 MySQL 数据库和 Java .jar 创建

mysql - 如果 SQL 查询没有找到结果,则返回默认值

java - 查询sql数据库中的索引表与使用自己的HashMap

javascript - 如何从定义的位置开始逐渐调整滚动上的粘性标题的大小

jquery - 是否可以在条件语句中链接 hasClass() 或 is() ?

python - 使用 groupby 和 groupby.size() 的输出

mysql - 在 where 子句中获取未知列

php - 将所有评论分配给 SQL 中的一篇文章

sql - 我如何违反此约束?

sql - 在oracle中获取日期