如何统计指定月份 用户用户充值金额与消费金额

公司项目,要求 按月统计 每个月所有用户消费金额与充值金额,并可以根据 月份 进行筛选。
原生SQL 也行。
可以给点建议吗?

在学rust 的小菜鸟啊
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 18
leo

做统计一般是做一个统计结果表,每天用定时任务重新统计数据,查的时候直接从统计结果表里取就行了。直接上 SQL 来统计不仅写起来麻烦、看起来不清晰,更重要的是慢。

5年前 评论

可以新建一个表出来。

5年前 评论

架构允许的话,上时序性数据库吧,可以满足了。

业界开源的 influxdb 好用,但是缺点就是集群不是开源的。

5年前 评论

@半人间 已经是新的表了,一张消费记录表 ,记录了 user_id, type -- 充值还是消费;现在就是按 月份统计,和指定月份查询

5年前 评论

把满足条件的所有数据都查询出来,然后用 php 来把数据处理成你想要的就行了,能用 php 处理的为什么要用 sql 去处理呢

5年前 评论

这个都是先取出数据,然后在php中循环处理数组就好了。为什么要在mysql里面处理呢

5年前 评论
leo

做统计一般是做一个统计结果表,每天用定时任务重新统计数据,查的时候直接从统计结果表里取就行了。直接上 SQL 来统计不仅写起来麻烦、看起来不清晰,更重要的是慢。

5年前 评论

一张天表,一张月表,一张年表,每天半夜统计到里面去。

5年前 评论

按 leo 说的做准没错,新表记得加一个date字段方便统计

5年前 评论

数据不多可以用 DATE_FORMAT 函数

SELECT SUM(`column`) FROM `table` WHERE DATE_FORMAT(`created_at`, '%Y-%m')='2019-09';
5年前 评论
xianyunyehe

这个常见做法,就是写个脚本 每天定时把前一天的结果汇总到一个新表中,这个新表就是聚合后的结果。然后查询的时候,如果需要当天的数据,查原表和新表进行组合。 比直接查明细表快很多。一年365天,10年才3000多条记录

5年前 评论
jcc123

目前也在做一个统计,不过统计后,没放进mysql,而是放进mongodb里面

5年前 评论

刚好之前有个项目也是有统计的,做法跟楼上各位说的一样,定时任务分表,查询差不多就像这样,随便改了下你可以看看,哈哈哈

$query = DB::table('XXXX_per_month as a')
            ->select(DB::raw("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX,DATE_FORMAT('created_at','%Y-%m') as date"))
            ->Join('users as b', 'a.user_id', '=', 'b.id')
            ->groupBy(DB::raw("date"))
            ->groupBy(DB::raw("b.username"));
//条件筛选 某时间段内
if (!empty($start)) {
    $query->whereRaw('created_at>= ?', $start);
}
if (!empty($end)) {
//
}
$data = $query->get();
5年前 评论

@张三 我现在用的也是这个方法 :joy:

5年前 评论

@leo 这个思路不错,但是现在的需求是支付宝支付流水通过excel或cvs导入数据库的,然后统计数据库的数据 :sob:
以后如果有新的需求在试试吧 ,也算是学到了,一种好的结果方式

5年前 评论

@kani 这个也不错,学到了 ,谢谢

5年前 评论

@xianyunyehe 谢谢你的建议,真实学道理不少,思路

5年前 评论

既然 指定月份查询统计 都写了, 指定年份 之 统计所有月份 sql也写上吧,( 原生SQL 自行转换 ORM, field 为时间类型的数据库字段 --datetime 或 timestamp)
SELECT
DATE_FORMAT( field ,'%Y-%m') as MONTH,
SUM( 需要统计的字段 )
FROM
table
WHERE
DATE_FORMAT(field ,'%Y') = '2019'
GROUP BY
date_format(field , '%Y-%m');

欧了 :joy:

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!