分组按行,其中值等于0或mysql中不存在的行?

时间:2018-12-31 04:37:56

标签: mysql sql group-by

我有一段简单的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 :(得分:0)

您需要一个想要跨越所有月份的关系。可以使用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;

(如果您要在一个月内没有任何数字,则将第二个参数更改为合并,如果您希望除0以外的任何其他数字。或者在这种情况下,如果您想要coalesce(),则根本不使用NULL