【场景】:总和单个、ONLY_FULL_GROUP_BY
【分类】:分组查询、last_day、any_value
分析思路
难点:
1.如何解决 ONLY_FULL_GROUP_BY 报错
2。如何计算某个月有多少天,使用 last_day
为什么会出现 ONLY_FULL_GROUP_BY 报错
ONLY_FULL_GROUP_BY的语义就是确定select list中的值要么是来自于聚合函数(sum、avg、max等)的结果,要么是来自于group by list中的表达式的值,在计算日均刷题数的时候,使用了day( last_day( submit_time)),这个数据是临时定义的,它即不来自聚合函数又不来自group by list,所以会报错。
如何解决报错
MySQL提供了 any_value() 函数来抑制ONLY_FULL_GROUP_BY值被拒绝
any_value()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据。在计算日均刷题数的时候,选择submit_month作为返回数据,这样就忽略了分母中的day( last_day( submit_time)),从而避免ONLY_FULL_GROUP_BY 报错。
求解代码
方法一:
# MySQL提供了any_value()函数来抑制ONLY_FULL_GROUP_BY值被拒绝。
(select
date_format(submit_time,'%Y%m') as submit_month,
any_value(count(question_id)) as month_q_cnt,
any_value(round(count(question_id)/day(last_day(submit_time)),3)) as avg_day_q_cnt
from practice_record
where year(submit_time) = 2021
group by submit_month)
union all
(select
'2021汇总' as submit_month,
count(question_id) as month_q_cnt,
round(count(id)/31,3) as avg_day_q_cnt
from practice_record
where year(submit_time) = 2021)
order by submit_month