【问题标题】:How sum values in days intervals MySQL 5.7?MySQL 5.7 如何以天为间隔求和值?
【发布时间】:2020-10-16 06:17:33
【问题描述】:

我有一台装有 MySQL 5.7 的服务器。 我有两张桌子。第一个 t 包含每个 id 的创建日期。第二个表t0 包含每个id 每天的利润记录。 我想为每个 id 以及第一天获取第一天和第二天 30 天的利润总和列。

SELECT t.created_at,
   t.id,
   sum(t1.profit) profit_1_week,
   sum(t2.profit) profit_2_week,
   sum(t3.profit) profit_1_day
FROM t
LEFT JOIN t0 t1 ON t.id = t.id
AND t1.inport_date BETWEEN t.created_at AND DATE_ADD(t.created_at, INTERVAL 30 DAY)
LEFT JOIN t0 t2 ON t.id = t.id
AND t2.inport_date BETWEEN DATE_ADD(t.created_at, INTERVAL 30 DAY) AND DATE_ADD(t.created_at, INTERVAL 60 DAY)
LEFT JOIN t0 t3 ON t.id = t.id
AND t3.inport_date BETWEEN t.created_at AND DATE_ADD(t.created_at, INTERVAL 1 DAY)
GROUP BY t.created_at,
         t.id
ORDER BY t.created_at

此代码运行但总和是错误的,因为第一天的总和比每月多得多。我错在哪里以及如何解决?

【问题讨论】:

  • t.Id 始终与您的 on 子句中的 t.Id 相同

标签: mysql sql datetime sum pivot


【解决方案1】:

您的问题陈述不是那么清楚,但根据您的尝试,我怀疑您可以进行条件聚合:

select t.created_at, t.id, 
    sum(case when t0.inport_date >= t.created_at                   and t0.inport_date < t.created_at + interval 30 day then t0.profit else 0 end) profit_1,
    sum(case when t0.inport_date >= t.created_at + interval 30 day and t0.inport_date < t.created_at + interval 60 day then t0.profit else 0 end) profit_2,
    sum(case when t0.inport_date >= t.created_at                   and t0.inport_date < t.created_at + interval  1 day then t0.profit else 0 end) profit_3
from t
left join t0 on t0.id = t.id 
group by t.created_at, t.id
order by t.created_at

逻辑是只加入一次,然后使用sum()s 中的case 表达式来选择应考虑哪些值。

我将日期过滤逻辑更改为使用半开间隔而不是 between,因为它似乎与我更相关。您可以根据自己的实际用例进行调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2020-12-07
    • 1970-01-01
    • 2016-01-05
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多