Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用两列不同条件的值进行算术运算,然后在一个查询中组合答案?_Mysql_Sql - Fatal编程技术网

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

Mysql 如何使用两列不同条件的值进行算术运算,然后在一个查询中组合答案?,mysql,sql,Mysql,Sql,我正试图计算具有特定日期条件的两个字段的总数,这必须显示为Chronic\u Load 然后,我想做一个类似的计算,但使用不同的日期标准,必须显示为急性负荷 然后我想进行第三次计算,慢性负荷除以急性负荷,即前两次计算的两个值 计算一: SELECT sum((rpe * duration)*1) AS "Acute_Load" FROM users_data where date between adddate(now(),-7) and now() 计算二: SELECT sum((rpe

我正试图计算具有特定日期条件的两个字段的总数,这必须显示为
Chronic\u 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"
如何将所有这些与中的两个不同标准结合起来?

WHERE
子句中添加“更宽”限制。如果日期不在范围内,则对于“较窄”的情况,请使用显示为零的
大小写

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();

我建议写得更简洁一些。以下假设
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比较应使用
    date
    s,而不是
    datetime
    s
  • 聚合上不需要
    else
    子句。它们忽略
    NULL
  • 列别名不需要转义,因此转义字符只会使查询混乱
  • 在我看来,区间算法比
    adddate()
    更清晰。它也更通用,适用于任何时间单位

我假设“日期标准”指的是
WHERE
条款?不过,这两个查询之间并没有什么不同。@很抱歉,我更正了它,一个是-7,另一个是-28。我得到:#1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解使用near')/sum(rpe*duration*1.5)作为“ACWD”的正确语法12@Seef:忘记了第二个
ELSE
分支。查看编辑。完美!工作完美。