SQL: замена NULL на 0 в таблице ежемесячных подсчетов - PullRequest
0 голосов
/ 20 января 2019

У меня есть таблица с именем GAINLP. Таблица содержит поля

'Record#"           (INT), 
'SightingDate'      (DATE), 
'SpeciesName'       (VARCHAR)

Требуется SQL для вывода массива, который содержит целое число, соответствующее сумме SightingDate для каждого месяца.

Пример : 0,0,0,0,1,5,10,12,5,3,0,0

Вместо этого следующий код вызывает nullсуммы значений, которые нужно пропустить, и у меня осталось 1,5,10,12,5,3

`select count(SightingDate) from GAINLP where SpeciesName LIKE '%Actias luna' GROUP BY MONTH(SightingDate)`

Я понимаю, что это можно сделать, присоединившись к таблице календаря, но я ненашел примеры такого кода, который также использует оператор WHERE.

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Вы можете использовать условное агрегирование здесь:

SELECT
    MONTH(SightingDate) AS month,
    COUNT(CASE WHEN SpeciesName LIKE '%Actias luna' THEN 1 END) cnt
FROM GAINLP
GROUP BY
    MONTH(SightingDate);

Но это может быть не так эффективно, как подход к объединению на основе календарной таблицы. Вот как вы можете это сделать:

SELECT
    t1.month,
    COUNT(t2.SightingDate) cnt
FROM (SELECT DISTINCT MONTH(SightingDate) AS month FROM GAINLP) t1
LEFT JOIN GAINLP t2
    ON t1.month = MONTH(t2.SightingDate)
WHERE
    t2.SpeciesName LIKE '%Actias luna'
GROUP BY
    t1.month;

Примечание. Вполне возможно, что ваши данные могут охватывать более определенного года, и в этом случае вы, вероятно, захотите сообщить как год, так и месяц.

0 голосов
/ 20 января 2019

Вы, похоже, ищете условную агрегацию.Принцип состоит в том, чтобы переместить логику фильтрации в конструкцию CASE в статистической функции.

SELECT 
    SUM(
        CASE
            WHEN SpeciesName LIKE '%Actias luna'
                THEN 1 
            ELSE 0
        END
    )
GROM gainlp 
GROUP BY MONTH(SightingDate)
...