背景 |
现有如下数据,需要按月进行分组汇总,计算每月各市的总金额。
地区 金额 时间
A市 1000 2017-08-28
A市 2000 2017-08-30
B市 3000 2017-01-03
B市 4000 2017-01-04
C市 5000 2017-01-04
C市 6000 2017-01-05
解决方案 |
分组查询,首先想到的是使用 Group By 结合聚合函数 SUM() 来完成统计。
SELECT
area,
SUM(money),
releaseDate
FROM datatable
GROUP BY area,releaseDate
不过这样的话,查询到的并不是我们想要的结果,因为表中的日期是精确到了日,只有同年同月同日的数据才会被汇总到一起,我们的目标是精确到月,那么就要把“年月日”转换为“年月”。
SELECT
area,
SUM(money),
CONCAT(YEAR(releaseDate),'-',MONTH(releaseDate)) AS releaseYearMonth
FROM datatable
GROUP BY area,releaseYearMonth
使用 Year()、Month()函数分别获取发布日期的年份和月份
使用 Concat()函数把年份和月份通过“-”重新连接起来
通过新得到的日期(精确到月份)重新分组
可能有些同学会遇到包含中文“年月日”的数据,如:2017年01月01日。这样的日期字符串直接按照上面的方式处理可能会出现Null值错误。可以查看我的另一篇文章:MySQL-日期字符串(*年月*日 格式)转Date类型 。
地区 金额 时间
A市 3000 2017-08
B市 7000 2017-01
C市 11000 2017-01