vlambda博客
学习文章列表

如何通过Mysql实现日报、周报、月报和年报?


以天为统计周期,是常见需求。周报、月报更是常见需求。长周期项目,甚至有年报需求。



1、按天统计

实现以天为统计周期很简单。具体来说, ` date() ` 函数可返回时间数据的日期,即仅有年月日,没有时分秒信息。结合 ` group by ` 可实现按天统计。

以天为统计周期的数据指标非常多,随便举例,比如每日新增注册用户数。

 select date(created_at) as 注册日期, count(user_id) as 用户数 from users group by 注册日期 order by 注册日期



 2、其它维度统计

既然 ` date() ` 函数可用,那么是否有对应的 ` year ` 、 ` month ` 、 ` week `
等函数可用呢?这纯属我的推理,那试试看吧。

果然可行。但美中不足的是,返回的周数和月数不带年份。当数据量跨年时,它会把每年相同周数或月数的数据加在一起。如何实现 ` 某年某月 ` 和 ` 某年某周 `呢?


在mysql中用 ` date_format(column_name,'%Y-%m') ` 来代替 ` month() ` 就能拿到 `年月 ` 值。

如果把其中代表月month的关键字 ` m ` 换成周week呢?试试看。分别尝试: 
` date_format(column_name,'%Y-%w') ` 和 ` date_format(column_name,'%Y-%W') ` 。 

数据返回结果不对呀?并不是预期的今年第几周。小写的 ` w ` 返回的是本周第几天,大写的 ` W ` 返回的是周几的英文名。如何拿到 ` 今年第几周 ` 这个值,实现周报的统计周期呢?




再用上 ` concat( ) ` 拼接函数

 select concat(date_format(created_at,'%Y-'),week(created_at)) as 年周, count(user_id) as 用户数 from users group by 年周 order by 年周



小结

总结一下,mysql中可通过 ` date_format() ` 和 ` concat() ` , ` week() `
等函数可完成数据分析中常用的月报、周报中按月、周统计的需求。关键语句为:

  date(column_name) as 年月日   date_format(column_name,'%Y-%m'as 年月  concat(date_format(column_name,'%Y-'),week(column_name) as 年周


-完-


是否对你有启发呢?如果有,记得留言或点赞告诉我,鼓励我多多分享。

DataFamilies
一线数据产品经理,拉勾网资深职业规划师。
9篇原创内容
Official Account