【问题标题】:Mysql Sum daily totals into weekly totals for given date rangeMysql 将给定日期范围内的每日总计转化为每周总计
【发布时间】:2017-01-25 14:53:41
【问题描述】:

目前我的 db 表每天都有 dailTotal 值,我需要将这些分组到每周总计中。

是否可以将每日总计添加到每周总计中,并在给定日期范围内每周显示一行。

我不太确定从哪里开始。我目前要获取的查询是:

SELECT dailyTotal
FROM   energyUsage
WHERE  meterIdentifier = '1300011505120'
      AND startTime >= '2017-01-01 00:00:00'
      AND startTime <= '2017-12-31 00:00:00';

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    星期可能有点模棱两可。一个方便的定义是内置定义。所以,你可以用yearweek()做你想做的事:

    SELECT YEAREWEEK(startTime) as yyyyww, SUM(dailyTotal)
    FROM  energyUsage
    WHERE  meterIdentifier = '1300011505120' AND
           startTime >= '2017-01-01' AND
           startTime <= '2017-12-31'
    GROUP BY yyyyww
    ORDER BY yyyyww;
    

    您可以查看mode 参数来控制星期是从星期日还是星期一开始,以及一年中的第一周是什么时候。没有模式说:“一年中的第一周从 1 月 1 日开始”,尽管您可以为此输入逻辑。

    注意:如果startTime 有时间组件,我猜你想要:

    WHERE  meterIdentifier = '1300011505120' AND
           startTime >= '2017-01-01' AND
           startTime < '2018-01-01'  -- note the inequality
    

    【讨论】:

    • 如果没有规定从 1 月 1 日开始的年份,您的查询中使用的是什么?因为这就是我想要的
    • @user794846 。 . .阅读mode 参数。 . . dev.mysql.com/doc/refman/5.7/en/….
    【解决方案2】:

    您可以使用聚合函数:

    SELECT dailyTotal,
           sum(dailyTotal) over (partition by EXTRACT(MONTH FROM StartTime)) as MonTotal
    FROM   energyUsage
    WHERE  meterIdentifier = '1300011505120'
          AND startTime >= '2017-01-01 00:00:00'
          AND startTime <= '2017-12-31 00:00:00';
    

    我在这里假设了很多事情,但你明白了。

    1- MySQL版本支持聚合函数

    2- 您的字段是日期类型

    【讨论】:

    • 您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 2 行的 '(partition by EXTRACT(MONTH FROM StartTime)) as MonTotal FROM energyUsage WHER' 附近使用
    • 什么版本的mysql允许over-partition?
    • $ mysql --version mysql Ver 15.1 Distrib 5.5.50-MariaDB, for Linux (x86_64) using readline 5.1
    • 但是你可以在 MySQL 中重现它。看stackoverflow.com/questions/11806528/…
    【解决方案3】:

    应该这样做:

    SELECT SUM(dailyTotal) AS weeklyTotal
    FROM   energyUsage
    WHERE  meterIdentifier = '1300011505120'
          AND startTime >= '2017-01-01 00:00:00'
          AND startTime <= '2017-12-31 00:00:00'
    GROUP BY YEAR(startTime),WEEK(startTime);
    

    【讨论】:

    • 这个似乎不起作用:“字段列表”中的未知列“weeklyTotal”
    猜你喜欢
    • 2021-04-10
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    相关资源
    最近更新 更多