簡體   English   中英

如果一行滿足特定條件,則匯總行

[英]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;

另一種方法是使用相關子查詢,以確保存在NameDay = 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

嘗試這個 :

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM