Как сделать арифметику со значениями из двух столбцов с разными критериями, а затем объединить ответы, все в одном запросе? - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь вычислить общее количество двух полей с определенными критериями даты, это должно быть отображено как 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"

Как объединить все это с двумя разными критериями в?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Я бы предложил написать это более кратко.Далее предполагается, что 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 с, а не datetime с.
  • Предложение else в агрегатах не требуется.Они игнорируют значения NULL.
  • Псевдонимы столбцов не нужно экранировать, поэтому экранирующие символы просто загромождают запрос.
  • По моему мнению, интервальная арифметика понятнее, чем adddate(),Он также более общий, работает для любой единицы времени.
0 голосов
/ 22 декабря 2018

Поместите "более широкое" ограничение в предложение 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...