我尝试选择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
都很慢,似乎需要改进。
我想这并不困难,但我现在已经尝试了几个小时,我只能将我的两个查询合并为一个。
答案 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 = 1
和Name
行:
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;