2016-07-28 46 views
0

使用MySQL 5.6我試圖在過去12個月中爲每個month選擇總計inspections,如果沒有輸出,則輸出爲0。由於輸出全部是NULL,我似乎錯過了一些東西。 date_inspected字段只是一個常規的SQL dateMySQL按月選擇在所有月份中返回NULL

從我所理解的結構應該是[conditional statement, output variable, default value],但即使0被忽略,有利於NULL。我想了解我在這裏做錯了什麼。

表:

Column   Type  Null  
id    int(11)  No   
inspector_id int(11)  Yes   
company_id  int(11)  Yes  
date_inspected date  No   
start_time  datetime No   
end_time  datetime No  

查詢:

SELECT 
    SUM(IF(MONTH = 'Jan', total, 0)) AS 'Januari', 
    SUM(IF(MONTH = 'Feb', total, 0)) AS 'Februari', 
    SUM(IF(MONTH = 'Mar', total, 0)) AS 'Maart', 
    SUM(IF(MONTH = 'Apr', total, 0)) AS 'April', 
    SUM(IF(MONTH = 'May', total, 0)) AS 'Mei', 
    SUM(IF(MONTH = 'Jun', total, 0)) AS 'Juni', 
    SUM(IF(MONTH = 'Jul', total, 0)) AS 'Juli', 
    SUM(IF(MONTH = 'Aug', total, 0)) AS 'Augustus', 
    SUM(IF(MONTH = 'Sep', total, 0)) AS 'September', 
    SUM(IF(MONTH = 'Oct', total, 0)) AS 'Oktober', 
    SUM(IF(MONTH = 'Nov', total, 0)) AS 'November', 
    SUM(IF(MONTH = 'Dec', total, 0)) AS 'December', 
    SUM(total) AS all_months 
    FROM (
     SELECT MONTH(date_inspected) AS MONTH, COUNT(*) AS total 
     FROM inspection 
     WHERE date_inspected BETWEEN NOW() AND Date_add(NOW(), interval - 12 month) 
     GROUP BY MONTH 
) AS SubTable 

輸出

{ ["Januari"]=> NULL 
["Februari"]=> NULL 
["Maart"]=> NULL 
["April"]=> NULL 
["Mei"]=> NULL 
["Juni"]=> NULL 
["Juli"]=> NULL 
["Augustus"]=> NULL 
["September"]=> NULL 
["Oktober"]=> NULL 
["November"]=> NULL 
["December"]=> NULL 
["all_months"]=> NULL } 

更新:

溶液Gordon Linoff

SELECT 
    SUM(CASE WHEN MONTH(date_inspected) = 1 THEN 1 ELSE 0 END) AS 'Januari', 
    SUM(CASE WHEN MONTH(date_inspected) = 2 THEN 1 ELSE 0 END) AS 'Februari', 
    SUM(CASE WHEN MONTH(date_inspected) = 3 THEN 1 ELSE 0 END) AS 'Maart', 
    SUM(CASE WHEN MONTH(date_inspected) = 4 THEN 1 ELSE 0 END) AS 'April', 
    SUM(CASE WHEN MONTH(date_inspected) = 5 THEN 1 ELSE 0 END) AS 'Mei', 
    SUM(CASE WHEN MONTH(date_inspected) = 6 THEN 1 ELSE 0 END) AS 'Juni', 
    SUM(CASE WHEN MONTH(date_inspected) = 7 THEN 1 ELSE 0 END) AS 'Juli', 
    SUM(CASE WHEN MONTH(date_inspected) = 8 THEN 1 ELSE 0 END) AS 'Augustus', 
    SUM(CASE WHEN MONTH(date_inspected) = 9 THEN 1 ELSE 0 END) AS 'September', 
    SUM(CASE WHEN MONTH(date_inspected) = 10 THEN 1 ELSE 0 END) AS 'Oktober', 
    SUM(CASE WHEN MONTH(date_inspected) = 11 THEN 1 ELSE 0 END) AS 'November', 
    SUM(CASE WHEN MONTH(date_inspected) = 12 THEN 1 ELSE 0 END) AS 'December' 
FROM inspection 
WHERE date_inspected BETWEEN Date_add(NOW(), interval - 12 month) AND NOW() 

據我瞭解,我們已經給SUM()條件CASE語句,如果當前記錄的date_inspected的MONTH等於MySQL的常量該值,返回true,並將其添加到總,否則什麼也不做。

More on MySQL CASE

+0

如果你喜歡,可以考慮下列行爲這個簡單的兩步過程:1.如果您還沒有這樣做的話,適當提供創建和插入語句(和/或sqlfiddle)這樣我們可以更容易地複製問題。 2.如果還沒有這樣做,請提供與步驟1中提供的信息相對應的所需結果集。 – Strawberry

回答

2

Juergen在您的查詢中有一個問題是正確的。另一個是MONTH()返回一個數字,而不是一個字符串。

而且,您可以進一步簡化查詢。是不是需要一個子查詢:

SELECT SUM(CASE WHEN MONTH(date_inspected) = 1 THEN 1 ELSE 0 END)) AS 'Januari', 
      SUM(CASE WHEN MONTH(date_inspected) = 2 THEN 1 ELSE 0 END)) AS 'Februari', 
      . . . 
    FROM inspection 
    WHERE date_inspected BETWEEN Date_add(NOW(), interval - 12 month) AND NOW(); 
+0

雖然我曾經刪除了GROUP BY,但它將所有其他值都設置爲0的每一個SUM結果放在它自己的行中,我工作正常。我使用下面的解決方案更新了問題,一個救生員。 –

2

between必須首先不使用較小的值周圍的其他方法。更改

BETWEEN NOW() AND Date_add(NOW(), interval - 12 month) 

BETWEEN Date_add(NOW(), interval - 12 month) and NOW() 

而且month()返回數月,而不是名字。

+0

現在儘管就我而言,它返回'SQLSTATE [HY000]:一般錯誤:1111無效使用組函數'可以告訴'GROUP BY'函數應該能夠使用'MONTH(column_name)'作爲參數。奇怪 –

+0

我更新了答案 –