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

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

在学rust 的小菜鸟啊
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 18
leo

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

4年前 评论

可以新建一个表出来。

4年前 评论

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

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

4年前 评论

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

4年前 评论

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

4年前 评论

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

4年前 评论
leo

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

4年前 评论

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

4年前 评论

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

4年前 评论

数据不多可以用 DATE_FORMAT 函数

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

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

4年前 评论
jcc123

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

4年前 评论

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

$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();
4年前 评论

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

4年前 评论

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

4年前 评论

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

4年前 评论

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

4年前 评论

既然 指定月份查询统计 都写了, 指定年份 之 统计所有月份 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:

4年前 评论

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