Группировка По строкам, где значение равно 0 или несуществующие строки в MySQL? - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть простой кусок кода SQL, где я пытаюсь получить среднемесячные числа.Но проблема, с которой я сталкиваюсь, состоит в том, что если любое число в любом заданном месяце равно 0, то среднее возвращаемое значение равно 0 или если есть какие-либо строки, которых не существует в каком-либо конкретном месяце, тогда значения для этого месяца вообще не возвращаются.Надеюсь, кто-нибудь может дать мне некоторое представление о том, что я делаю неправильно.

GROUP BY 1 = a.metric и GROUP BY 2 = a.report_dt в подзапросе

Я попытался вставитьотсутствующие строки со значением 0, но, как я уже сказал, он также возвращает усредненное значение как 0.

SELECT  a.report_dt - INTERVAL 1 DAY AS 'Date',
        a.metric,
        a.num
FROM    (SELECT *
         FROM reporting.tbl_bo_daily_levels b
         WHERE b.report_dt = reporting.func_first_day(b.report_dt)
         AND b.report_dt > DATE_SUB(NOW(), INTERVAL 12 MONTH)
         GROUP BY 1,2
    )a;

Мои ожидаемые результаты - получить средние числа каждого месяца, даже если нет-существующие строки в указанном диапазоне дат или даже если там нули в качестве значений.

1 Ответ

0 голосов
/ 31 декабря 2018

Вам нужно отношение всех месяцев, которые вы хотите охватить.Это может быть сделано с помощью UNION ALL.Затем слева соедините данные по месяцам GROUP BY месяц и метрику и получите avg(num).

SELECT m.year,
       m.month,
       l.metric,
       coalesce(avg(l.num), 0)
       FROM (SELECT 2017 year,
                    12 month
             UNION ALL
             SELECT 2018 year,
                    1 month
             UNION ALL
             SELECT 2018 year,
                    2 month
             ...
             SELECT 2018 year,
                    11 month
             UNION ALL
             SELECT 2018 year,
                    12 month) months m
            LEFT JOIN reporting.tbl_bo_daily_levels l
                      ON year(l.report_dt) = m.year
                         AND month(l.report_dt) = m.month;
            GROUP BY m.year,
                     m.month,
                     l.metric;

(Измените второй параметр на coalesce, если вы хотите любое другое число, кроме 0, если нетцифры на месяц. Или вообще не используйте coalesce(), если хотите в таких случаях NULL.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...