2016-07-28 4 views
0

Использование MySQL 5.6 Я пытаюсь выбрать общее количество inspections за каждые month за последние 12 месяцев с выводом 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() 

Как я понимаю, мы дали условный оператор CASE, SUM() что если date_inspected «s МЕСЯЦ текущей записи равна константе MySQL для этого значения, возвращает истину, и добавить его в общей сложности , иначе ничего не делать.

More on MySQL CASE

+0

Если вы хотите, рассмотрит следующую этой простой двухступенчатого курс действий: 1. Если вы еще не сделали этого, обеспечить надлежащее создание и вставку заявления (и/или sqlfiddle) так что мы сможем легче воспроизвести проблему. 2. Если вы еще этого не сделали, укажите желаемый результирующий набор, соответствующий информации, представленной на шаге 1. – Strawberry

ответ

2

Юрген правильно по одной проблеме в вашем запросе. Другим является то, что 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, потому что он помещал каждый результат SUM в свою собственную строку со всеми остальными значениями, установленными в 0. Я обновляю вопрос с помощью решения ниже, вы спасатель. –

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) 'в качестве аргумента. Strange –

+0

Я обновил ответ –