2015-09-04 99 views
0

我試圖選擇isOK列中每個Name分隔的值的總和,但僅當對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 

應該給弗洛查詢:2和添:1,但不勒布:1,因爲他的isOKDay = 2爲0。

我已經嘗試使用帶IF結構的SUM(isOK),但它不工作。我的替代解決方案,選擇全部Name其中isOK = 1首先爲每個名稱選擇SUM(isOK)是慢的,似乎需要改進。

我想這不是那麼困難,但我一直在嘗試幾個小時,而我無法將我的兩個查詢合併爲一個。要做到這一點

回答

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 = 2isOk = 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 
+0

我加了一個小提琴(終於)給了我一個迴應。也許它會把它給它人,最終:) –

+0

@ X.L.Ant謝謝。我無法讓小提琴奏效 - 猜想它可能因超負荷或其他原因超時。 – jpw

+0

我想是的。 SQLfiddle最近做了很多。 –

0

試試這個:

SELECT 
    name, SUM(isok) AS isOk 
FROM 
    table 
GROUP BY `name` 
HAVING SUM(`day` = 2 AND isok = 1) > 0; 
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; 
相關問題