最近在牛客网刷sql题的时候,认识了COALESCE()函数,打算做一个小记录。
题目如下:

一开始关于题解我做了一些记录,最初的想法是用UNION ALL,

SELECT DATE_FORMAT(submit_time, '%Y%m') AS submit_month,
COUNT(question_id) AS month_q_cnt,
ROUND(COUNT(question_id)/DAY(LAST_DAY(submit_time)), 3) AS avg_day_q_cnt
FROM practice_record
WHERE submit_time IS NOT NULL AND YEAR(submit_time)='2021'
GROUP BY DATE_FORMAT(submit_time, '%Y%m')
UNION ALL
SELECT '2021汇总' AS submit_month,
COUNT(question_id) AS month_q_cnt,
ROUND(COUNT(question_id)/31, 3) AS avg_day_q_cnt
FROM practice_record
WHERE submit_time IS NOT NULL AND YEAR(submit_time)='2021'
ORDER BY submit_month
提交通过,后面想尝试其他方法时查找资料发现还可以用COALESCE()函数。用法如下:
coalesce (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值。
sql语句:
![]()
当avg_q_cnt为null值时,返回1,否则将返回avg_q_cnt的真实值。
![]()
当第一个参数avg_q_cnt不为null时,不论第二个参数avg_q_cnt1是否为null值,都只返回参数avg_q_cnt的真实值,当avg_q_cnt为null且avg_q_cnt1不为null时,返回参数avg_q_cnt1的真实值;只有当第一二个参数均为null值时,才返回1。
代码:
SELECT COALESCE(DATE_FORMAT(submit_time, '%Y%m'), '2021汇总') AS submit_month,
COUNT(question_id) AS month_q_cnt,
ROUND(COUNT(question_id)/MAX(DAY(LAST_DAY(submit_time))), 3) AS avg_day_q_cnt
FROM practice_record
WHERE submit_time IS NOT NULL AND YEAR(submit_time)='2021'
GROUP BY DATE_FORMAT(submit_time, '%Y%m') WITH ROLLUP提交结果如下:

此外,通过这道题还学到了另外一个知识点:WITH ROLLUP
with在sql语句中定义在group by之后,当需要对数据库进行分类统计的时候,往往会用上group by进行分组。而在group by后面还可以加入with cube或with rollup等关键字对数据进行汇总。不过这个cube在mysql中并不适用。
with rollup函数是对聚合函数进行求和,且是对group by后的第一个字段进行分组计算。
版权声明:本文为m0_46968548原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。