[英]Aggregate rows if one row meets a specific condition
我試圖為isOK
分隔的每個Name
選擇isOK
列中值的總和,但僅當Day = 2
上的isOK = 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,因為他在Day
= 2的isOK
為0。
我已經嘗試過將SUM(isOK)與IF構造一起使用,但是它不起作用。 我的替代解決方案是先選擇isOK
= 1的所有Name
,然后為每個名稱選擇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評估布爾表達式為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
嘗試這個 :
SELECT
name, SUM(isok) AS isOk
FROM
table
GROUP BY `name`
HAVING SUM(`day` = 2 AND isok = 1) > 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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.