mysql 怎么统计每天某个字段之和? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
KigKrazy
V2EX    程序员

mysql 怎么统计每天某个字段之和?

  •  
  •   KigKrazy 2019-06-21 11:55:40 +08:00 6103 次点击
    这是一个创建于 2307 天前的主题,其中的信息可能已经有所发展或是发生改变。

    类似有一个表

    字段如下:

    name(销售名) b(int,类似销售金额) time(datetime,时间戳) 

    需要的查询结果

    name total(销售总额,当天所以 B 字段加起来的和) 日期( yy-MM-dd ) 

    各位有什么资料连接,或者提示的? 给个文章自己研究,目前百度下几个方案好像不是很好。

    第 1 条附言    2019-06-21 15:42:10 +08:00
    想在问下大家生产环境,比如订单什么的,想要按周统计,按月统计,都是怎么个操作手段?
    27 条回复    2019-06-22 12:29:15 +08:00
    jorneyr
        1
    jorneyr  
       2019-06-21 12:00:10 +08:00
    可以参考一下: select date(created_at), count(1) from user group by date(created_at)
    Maboroshii
        2
    Maboroshii  
       2019-06-21 12:08:27 +08:00
    select from_unixtime(time, '%Y-%m-%d) as date, name, sum(b) from t group by date, name, order by date
    Mac
        3
    Mac  
       2019-06-21 14:55:21 +08:00 via Android
    group by
    Raymon111111
        4
    Raymon111111  
       2019-06-21 14:58:21 +08:00
    插入的时候实时计算, 扔到缓存里

    然后每天再把缓存里的数落地

    容错性强一点可以每小时或者半小时搞一次, 要是挂了只用再 count 当前小时的数据即可

    强行用 sql 去搞这个不是给自己制造麻烦吗
    neoblackcap
        5
    neoblackcap  
       2019-06-21 14:59:10 +08:00
    一般的做法都是另外建一张汇总表,第二天统计昨天的结果,将结果汇总。
    这个汇总的过程就不限于 SQL,你写一个定时程序就可以了
    wqzjk393
        6
    wqzjk393  
       2019-06-21 15:07:50 +08:00
    先套一层子查询,把时间戳转成你要的那个 yymmdd 格式,然后 select name,sum(b),time_format from 子查询 group by(name,time_format)
    cpdyj0
        7
    cpdyj0  
       2019-06-21 15:14:58 +08:00
    用 SQL 搞可能会降低性能哦
    zarte
        8
    zarte  
       2019-06-21 15:35:54 +08:00
    select sum ( b ) as total,name where time< and time>= group by name
    KigKrazy
        9
    KigKrazy  
    OP
       2019-06-21 15:39:15 +08:00
    谢谢大家的回复 @!!!!
    另外问下大家都是怎么做的,我在创建比如订单的时候加上一个日期可以吗?


    大家生产环境都是怎么个操作手法呢
    Beeethoven
        10
    Beeethoven  
       2019-06-21 15:44:55 +08:00
    要是我的话 新建一张表 然后在服务器跑段定时代码,每天固定时间统计 timestamp 在今天内的所有行,运算完毕后存到新表里。只用 SQL 不仅麻烦而且脱离实际啊
    KigKrazy
        11
    KigKrazy  
    OP
       2019-06-21 15:46:42 +08:00
    @neoblackcap
    @Raymon111111
    这样子不就不能比较实时的查看数据了?总感觉不好
    KigKrazy
        12
    KigKrazy  
    OP
       2019-06-21 15:46:59 +08:00
    @cpdyj0
    你们生产环境是什么方案
    Ritr
        13
    Ritr  
       2019-06-21 15:51:12 +08:00
    @neoblackcap 嗯说的对,定时汇总到一张汇总表里即可。简单有效查询还快
    Ritr
        14
    Ritr  
       2019-06-21 15:53:22 +08:00
    @KigKrazy 要看实时数据,可以结合汇总表的数据+当前数据进行计算。比如汇总表的数据是 2019-6-1 到 2019-6-20 的数据,而 2019-6-21 的数据重新查出来即可。
    Ritr
        15
    Ritr  
       2019-06-21 15:54:02 +08:00
    @Ritr 如果要查询 2019-6-1 到 2019-6-21,结合两者的数据就行了
    zisway
        16
    zisway  
       2019-06-21 16:00:45 +08:00
    历史统计数据加今日统计数据,定时任务统计好历史数据就可以了
    l1203
        17
    l1203  
       2019-06-21 16:17:07 +08:00
    只有 sqlserver 的实现,我创建了一个数据库试了下,能按要求查出来。
    select Name,SUM(Money) as Total,CONVERT(VARCHAR(10),CreateTime,120) AS Dates from Test group by Name,CONVERT(VARCHAR(10),CreateTime,120)
    ahjiangwu
        18
    ahjiangwu  
       2019-06-21 16:25:19 +08:00
    #17 楼的方法可行
    只是对于数据量的情况,几乎很难实现

    #4 楼给了分治的方法可以参考

    我遇到的情况用的与 #5 类似的方法,只是把数据拆的更细,冗余了日期和小时字段
    neoblackcap
        19
    neoblackcap  
       2019-06-21 16:49:58 +08:00
    不说数据量,单单最求实时是不现实的。你一秒几十个订单,你的实时也不准啊。
    你每分钟读从库汇总一次,实时性也不差啊。
    如果要真正既实时又准确,怕是需要大改造你们现有的系统。所以这样的需求,用最简单的方法解决就可以了。
    单独的一个定时任务,谁来维护都很容易,出错的可能性也不大。
    Raymon111111
        20
    Raymon111111  
       2019-06-21 16:55:09 +08:00
    @KigKrazy 啥? 实时数据缓存里有啊

    更具体的做法是, 数据库里来了一条记录 insert 完, 立马缓存去加.

    这个时候缓存里的总和和数据库里是完全一致的
    dyllen
        21
    dyllen  
       2019-06-21 17:35:14 +08:00
    统计这种需求,一般是定时计算,查看的都是预先计算好的数据。
    如果是实时去查下统计,性能是个问题。
    dyllen
        22
    dyllen  
       2019-06-21 17:36:51 +08:00
    按天,可以第二天统计前一天的数据;按周,可以每周一统计上一周的数据;按月,可以每月 1 号统计上个月的数据。这样类推。
    wysnylc
        23
    wysnylc  
       2019-06-21 18:06:05 +08:00
    两种方案 定时统计和新增+1,前者每天统计当前的数据总额新增到汇总表中
    后者在每次新增数据会进行+1 可以实时读取
    KigKrazy
        24
    KigKrazy  
    OP
       2019-06-21 18:27:19 +08:00 via Android
    @dyllen 嗯嗯 了解谢谢
    akira
        25
    akira  
       2019-06-21 19:42:15 +08:00
    select xxx group by,就是个分组统计。等到你们出现性能问题的时候 再针对性处理就好
    zjyl1994
        26
    zjyl1994  
       2019-06-22 12:26:18 +08:00
    SELECT `name`,sum(`b`) AS total,DATE_FORMAT(`time`,'yyyy-MM-dd') AS date_char FROM table GROUP BY name,datechar
    可能是你想要的效果?
    zjyl1994
        27
    zjyl1994  
       2019-06-22 12:29:15 +08:00
    我错了,按天的应该这样的
    SELECT `name`,sum(`b`) AS total,DATE_FORMAT(`time`,'%Y-%m-%d') AS date_char FROM table GROUP BY name,datechar
    如果周的话
    SELECT `name`,sum(`b`) AS total,DATE_FORMAT(`time`,'%Y(%u)') AS date_char FROM table GROUP BY name,datechar
    月的话
    SELECT `name`,sum(`b`) AS total,DATE_FORMAT(`time`,'%Y-%m') AS date_char FROM table GROUP BY name,datechar

    最近在做报表类的,这 sql 也是我司大佬教我的
    关于     帮助文档     助推广系统     博客     API     FAQ     Solana     3252 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 11:42 PVG 19:42 LAX 04:42 JFK 07:42
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86