我有一段简单的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;
即使在指定的日期范围内不存在任何行,或者即使零值,我的预期结果也是获得每个月的平均值。
答案 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
)