如何对两列中不同条件的值进行算术运算,然后在一个查询中组合答案?

4sup72z8  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(316)

我试图计算两个特定日期条件字段的总数,这必须显示为 Chronic_Load .
然后我想做一个类似的计算,但有一个不同的日期标准,必须显示为 Acute_Load .
那么我想第三次计算在哪里 Chronic_Load 除以 Acute_Load ,即前两次计算的两个值。
计算一:

SELECT sum((rpe * duration)*1) AS "Acute_Load" FROM users_data where date between adddate(now(),-7) and now()

计算二:

SELECT sum((rpe * duration)*1.5) AS "Chronic_Load" FROM users_data where date between adddate(now(),-28) and now()

计算三:

SELECT sum(Acute_Load / Chronic_Load) AS "ACWD"

如何将所有这些与中的两个不同标准结合起来?

idfiyjo8

idfiyjo81#

我建议写得更简洁一些。以下假设 date 确实是一个日期,而且永远不会在将来:

select sum(case when date >= current_date - interval 7 day
                then rpe * duration
           end) as Acute_Load,
       sum(rpe * duration * 1.5) as Chronic_Load,
       ( sum(case when date >= current_date - interval 7 day
                  then rpe * duration
             end) /
         sum(rpe * duration * 1.5) 
       ) as acwd
from users_data
where date >= current_date - interval 28 day;

注意这些变化:
日期比较应使用 date s、 不是 datetime s。
这个 else 聚合上不需要子句。他们无视 NULL 价值观。
列别名不需要转义,因此转义字符只会使查询混乱。
区间运算比 adddate() ,在我看来。它也更通用,适用于任何时间单位。

mrphzbgm

mrphzbgm2#

把“更广泛”的限制放在 WHERE 条款。对于“更窄的”使用 CASE 如果日期不在范围内,那就等于零。

SELECT sum(CASE
             WHEN date BETWEEN adddate(now(), -7) AND now() THEN
               rpe * duration
             ELSE
               0
           END) "Acute_Load",
       sum(rpe * duration * 1.5) "Chronic_Load",
       sum(CASE
             WHEN date BETWEEN adddate(now(), -7) AND now() THEN
               rpe * duration
             ELSE
               0
           END) / sum(rpe * duration * 1.5) "ACWD"
       FROM users_data
       WHERE date BETWEEN adddate(now(), -28) and now();

相关问题