首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  程序员

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

  •  
  •   KigKrazy · 176 天前 · 2693 次点击
    这是一个创建于 176 天前的主题,其中的信息可能已经有所发展或是发生改变。

    类似有一个表

    字段如下:

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

    需要的查询结果

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

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

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

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

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

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


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

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

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

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

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