2017-06-21 70 views
3

我正在基於其他兩列的值做一個列的平均值。MySQL AVG錯誤的結果與ELSE 0

表結構是這樣的

| rid | rate | status |.... 
| 1 | 1500 | 1 |.... 
| 1 | 1500 | 1 |.... 
| 1 | 1500 | 1 |.... 
| 1 | 1500 | 1 |.... 
| 2 | 1500 | 1 |.... 

當我做這樣它給了我正確的結果1500,但它沒有CASE比賽返回NULL,我需要AVG返回0如果沒有相匹配的行的CASE條件。

AVG(CASE WHEN `rid` = `status` THEN `rate` END) DIV 1 AS `avg` 

我試過這種方式,但它給了我錯誤的結果作爲1200

AVG(CASE WHEN `rid` = `status` THEN `rate` ELSE 0 END) DIV 1 AS `avg` 

爲什麼我得到錯誤的結果?

請參閱並提出任何可能的方式來做到這一點。

感謝

+0

請問你是否添加了記錄,你的錯誤答案是? –

回答

3

4有效的內容試試這個

IFNULL(AVG(CASE WHEN `rid` = `status` THEN `rate` END) DIV 1,0) AS `avg` 

注:MySQL的IFNULL需要兩個參數,如果第一個參數不爲null,那麼它返回第一個參數,否則返回第二個參數

+1

這與我的回答一樣,只使用專有的'IFNULL'而不是標準的'COALESCE',甚至錯誤地應用它。請看你在哪裏放置',0)'。它應該在'AVG'的右括號之後或'DIV 1'之後,而不是在別名之後。 –

0

上你的結果應用COALESCE

COALESCE(AVG(CASE WHEN `rid` = `status` THEN `rate` END), 0) DIV 1 AS `avg` 
+2

請降低這個的人,請解釋爲什麼? OP有一個工作公式(即只處理公式中的rid =狀態記錄,導致樣本數據的正確值爲1500)。只有當沒有rid = status記錄時,它們自然會得到NULL而不是零。 'COALESCE'將NULL變成零,從而解決了這個問題。這是執行此操作的標準方法,適用於所有DBMS。 –

+1

主席先生,你的答案是更加擱淺的做法,但我會使用'IFNULL'作爲其更快。 –

+0

@Tall Boy:我不介意你更喜歡'IFNULL',但我懷疑速度有什麼不同。我猜只能有幾個納秒。 –

1
SELECT AVG(RATE) FROM TABLENAME GROUP BY rid,status 

試試上面的查詢。

希望這會幫助你。

1

您正在獲得1200,因爲最後一行的情況下將返回0仍然會計爲一行,因此(1500 * 4 + 0)/ 5 = 1200

1

的原因是基於作爲案件時,過濾器從表
在第一個行選擇

AVG(CASE WHEN `rid` = `status` THEN `rate` END) DIV 1 AS `avg` 

的情況下,條件FO只有4行
執行時做的事實,你有沒有其他條件的查詢只用於匹配rid = status

在第二

濾波器

else子句意味着使用最後一排也(RID = 2),所以你有5列的平均