2015-12-30 51 views
0

我有一個請求在不同的情況下計算字段的值。如果在MYSQL中找不到值,如何設置SUM(CASE WHEN)函數的返回值爲0?

這裏是要求:

SELECT SUM(CASE WHEN Reliquat_id = 1 THEN Poids END) AS NbrARRNP, 
         SUM(CASE WHEN Reliquat_id = 2 THEN Poids END) AS NbrSTNP, 
         SUM(CASE WHEN Reliquat_id = 3 THEN Nombre END) AS NbrARR, 
         SUM(CASE WHEN Reliquat_id = 4 THEN Nombre END) AS ST, 
         SUM(CASE WHEN Reliquat_id = 5 THEN Nombre END) AS NbrCLASS, 
         SUM(CASE WHEN Reliquat_id = 6 THEN Nombre END) AS NbrINDEX FROM datas WHERE Chantier_id = 4 AND main_id =1; 

有時我得到一個問題,如果存在的情況下沒有記錄。返回值爲空。

  • 例如:如果在Reliquat_id = 2的情況下沒有記錄,那麼我得到空值而不是零。

我看到的StackOverflow的另一個問題是有趣:

How do I get SUM function in MySQL to return '0' if no values are found?

我嘗試使用論文功能了我的請求,但我不understant在我的情況下適用的語法。

你有什麼想法嗎?

感謝

+2

您可以在其他情況下添加其他情況,如SUM(CASE WHEN Reliquat_id = 1 THEN Poids ELSE 0 END) –

回答

2

只需添加ELSE 0

SELECT SUM(CASE WHEN Reliquat_id = 1 THEN Poids ELSE 0 END) AS NbrARRNP, 
     SUM(CASE WHEN Reliquat_id = 2 THEN Poids ELSE 0 END) AS NbrSTNP, 
     SUM(CASE WHEN Reliquat_id = 3 THEN Nombre ELSE 0 END) AS NbrARR, 
     SUM(CASE WHEN Reliquat_id = 4 THEN Nombre ELSE 0 END) AS ST, 
     SUM(CASE WHEN Reliquat_id = 5 THEN Nombre ELSE 0 END) AS NbrCLASS, 
     SUM(CASE WHEN Reliquat_id = 6 THEN Nombre ELSE 0 END) AS NbrINDEX 
FROM datas 
WHERE Chantier_id = 4 AND main_id = 1; 

注意:這仍然會返回與所有NULL值的行,如果沒有行,在所有符合條件WHERE

+0

您的解決方案非常好,謝謝 – Julien698

2

使用IFNULL()COALESCE()功能

SQL NULL Functions-W3 Schools Ref

IFNULL(Poids,0)COALESCE(Poids,0)

+0

我嘗試但它不起作用 – Julien698

+0

你正在得到什麼錯誤。 –

+0

查詢正在工作,但返回時出現問題。我得到5.92 | null | 0 | null | null | null而不是5.92 | null | null | null | null在我的第一個請求沒有修改。而我得到5.92 | 0 | 0 | 0 | 0 – Julien698

1

請再試此

SELECT IFNULL(SUM(CASE WHEN Reliquat_id = 1 THEN Poids ELSE 0 END),0) AS NbrARRNP, 
     IFNULL(SUM(CASE WHEN Reliquat_id = 2 THEN Poids ELSE 0 END),0) AS NbrSTNP, 
     IFNULL(SUM(CASE WHEN Reliquat_id = 3 THEN Nombre ELSE 0 END),0) AS NbrARR, 
     IFNULL(SUM(CASE WHEN Reliquat_id = 4 THEN Nombre ELSE 0 END),0) AS ST, 
     IFNULL(SUM(CASE WHEN Reliquat_id = 5 THEN Nombre ELSE 0 END),0) AS NbrCLASS, 
     IFNULL(SUM(CASE WHEN Reliquat_id = 6 THEN Nombre ELSE 0 END),0) AS NbrINDEX 
FROM datas 
WHERE Chantier_id = 4 AND main_id = 1; 
+0

我剛剛嘗試過,它告訴我:「調用本地函數'ISNULL'時的參數計數不正確」 – Julien698

+0

如果ELSE仍然存在,爲什麼要放置ISNULL? – Julien698

+0

'Else'如果找到記錄,並且Reliquat_id <> 1,ISNULL工作時沒有找到記錄 –

0

使用否則0例(Reliquat_id = 5和Reliquat_id = 6)作爲以及你爲其他案件做的。試試這個:

SELECT SUM(CASE WHEN Reliquat_id = 1 THEN Poids ELSE 0 END) AS NbrARRNP, 
     SUM(CASE WHEN Reliquat_id = 2 THEN Poids ELSE 0 END) AS NbrSTNP, 
     SUM(CASE WHEN Reliquat_id = 3 THEN Nombre ELSE 0 END) AS NbrARR, 
     SUM(CASE WHEN Reliquat_id = 4 THEN Nombre ELSE 0 END) AS ST, 
     SUM(CASE WHEN Reliquat_id = 5 THEN Nombre ELSE 0 END) AS NbrCLASS, 
     SUM(CASE WHEN Reliquat_id = 6 THEN Nombre ELSE 0 END) AS NbrINDEX 
     from 
0

最後,這裏的最後一個請求:

SELECT IFNULL(SUM(CASE WHEN Reliquat_id = 1 THEN Poids END),0) AS NbrARRNP, 
     IFNULL(SUM(CASE WHEN Reliquat_id = 2 THEN Poids END),0) AS NbrSTNP, 
     IFNULL(SUM(CASE WHEN Reliquat_id = 3 THEN Nombre END),0) AS NbrARR, 
     IFNULL(SUM(CASE WHEN Reliquat_id = 4 THEN Nombre END),0) AS ST, 
     IFNULL(SUM(CASE WHEN Reliquat_id = 5 THEN Nombre END),0) AS NbrCLASS, 
     IFNULL(SUM(CASE WHEN Reliquat_id = 6 THEN Nombre END),0) AS NbrINDEX 
FROM datas 
WHERE Chantier_id = 4 AND main_id = 1; 

我覺得這是解決這個問題的最好要求,因爲如果在數據庫中沒有記錄「否則爲0」不工作,返回0現在使用IFNULL即使沒有記錄,它總是返回0.

相關問題