1、这道题卡住我的点是,如何在submit_month加入“2021汇总”,这里可以用ifull函数或者coalesce函数,为什么一直不能运行,试验了总结下:这两个函数后面接的表达式应该是直接可以用的表达式,也就是数据源已生成的列,这就需要我们在数据源就计算好date_format(submit_time,'%Y%m')作为一列。
2、第二难的点是,MAX(DAY(last_day(submit_time)这里
(1)用max,其实就是为了去除重复值,用min,avg函数均可以。
(2)last_day(submit_time) 是为了计算对应日期最后一天的日期
(3)day是为了计算最后一天的日期对应的天数(所在月)
DAY()可以用dayofmonth 函数代替
3、WITH ROLLUP就是为了计算得到group by的汇总信息,也就是“2021汇总”列的求和数


方法一(为了试验ifull函数或者coalesce函数后面是不是得接数据源的列而建)
select 
ifnull(D,"2021汇总") submit_month,
count(submit_time) month_q_cnt,
ROUND(COUNT(submit_time)/MAX(DAY(last_day(submit_time))),3) AS avg_day_q_cnt
from practice_record p1
join 
(select id,
date_format(submit_time,'%Y%m') D from practice_record where year(submit_time)=2021) p2
on p1.id=p2.id
group by D WITH ROLLUP

方法二:嵌套函数(最佳)
select ifnull(a.ymd, '2021汇总'), count(1), round(count(1)/max(da),3)
from (
    select DATE_FORMAT(submit_time, '%Y%m') ymd, 
    DAYOFMONTH(last_day(submit_time)) da
    from practice_record 
    where year(submit_time) = '2021' ) a
group by a.ymd
with rollup

方法三:union函数
SELECT
    DATE_FORMAT(submit_time, '%Y%m') submit_month,
    count(1),
    ROUND(count(1)/DAY(LAST_DAY(DATE_FORMAT(max( submit_time),'%Y%m%d' ))),3)
FROM
    practice_record
WHERE
    YEAR (submit_time) = '2021'
GROUP BY
    DATE_FORMAT(submit_time, '%Y%m')
UNION ALL
SELECT
    '2021汇总' submit_month,
    count(1),
    ROUND(count(1)/31, 3)
FROM
    practice_record
WHERE
    YEAR (submit_time) = '2021'
ORDER BY
    submit_month