• 请不要在回答技术问题时复制粘贴 AI 生成的内容
KigKrazy
V2EX  ›  程序员

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

  •  
  •   KigKrazy · Jun 21, 2019 · 6536 views
    This topic created in 2521 days ago, the information mentioned may be changed or developed.

    类似有一个表

    字段如下:

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

    需要的查询结果

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

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

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

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

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

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


    大家生产环境都是怎么个操作手法呢
    Beeethoven
        10
    Beeethoven  
       Jun 21, 2019
    要是我的话 新建一张表 然后在服务器跑段定时代码,每天固定时间统计 timestamp 在今天内的所有行,运算完毕后存到新表里。只用 SQL 不仅麻烦而且脱离实际啊
    KigKrazy
        11
    KigKrazy  
    OP
       Jun 21, 2019
    @neoblackcap
    @Raymon111111
    这样子不就不能比较实时的查看数据了?总感觉不好
    KigKrazy
        12
    KigKrazy  
    OP
       Jun 21, 2019
    @cpdyj0
    你们生产环境是什么方案
    Ritr
        13
    Ritr  
       Jun 21, 2019
    @neoblackcap 嗯说的对,定时汇总到一张汇总表里即可。简单有效查询还快
    Ritr
        14
    Ritr  
       Jun 21, 2019
    @KigKrazy 要看实时数据,可以结合汇总表的数据+当前数据进行计算。比如汇总表的数据是 2019-6-1 到 2019-6-20 的数据,而 2019-6-21 的数据重新查出来即可。
    Ritr
        15
    Ritr  
       Jun 21, 2019
    @Ritr 如果要查询 2019-6-1 到 2019-6-21,结合两者的数据就行了
    zisway
        16
    zisway  
       Jun 21, 2019
    历史统计数据加今日统计数据,定时任务统计好历史数据就可以了
    l1203
        17
    l1203  
       Jun 21, 2019
    只有 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  
       Jun 21, 2019
    #17 楼的方法可行
    只是对于数据量的情况,几乎很难实现

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

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

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

    这个时候缓存里的总和和数据库里是完全一致的
    dyllen
        21
    dyllen  
       Jun 21, 2019
    统计这种需求,一般是定时计算,查看的都是预先计算好的数据。
    如果是实时去查下统计,性能是个问题。
    dyllen
        22
    dyllen  
       Jun 21, 2019
    按天,可以第二天统计前一天的数据;按周,可以每周一统计上一周的数据;按月,可以每月 1 号统计上个月的数据。这样类推。
    wysnylc
        23
    wysnylc  
       Jun 21, 2019
    两种方案 定时统计和新增+1,前者每天统计当前的数据总额新增到汇总表中
    后者在每次新增数据会进行+1 可以实时读取
    KigKrazy
        24
    KigKrazy  
    OP
       Jun 21, 2019 via Android
    @dyllen 嗯嗯 了解谢谢
    akira
        25
    akira  
       Jun 21, 2019
    select xxx group by,就是个分组统计。等到你们出现性能问题的时候 再针对性处理就好
    zjyl1994
        26
    zjyl1994  
       Jun 22, 2019
    SELECT `name`,sum(`b`) AS total,DATE_FORMAT(`time`,'yyyy-MM-dd') AS date_char FROM table GROUP BY name,datechar
    可能是你想要的效果?
    zjyl1994
        27
    zjyl1994  
       Jun 22, 2019
    我错了,按天的应该这样的
    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 也是我司大佬教我的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2874 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 63ms · UTC 12:25 · PVG 20:25 · LAX 05:25 · JFK 08:25
    ♥ Do have faith in what you're doing.