Подсчет всех значений, сумма между одним диапазоном и счет в другом - PullRequest
0 голосов
/ 20 февраля 2020

Попытка выполнить запрос, который выполняет три вещи. Я хочу:

  1. Получить сумму, которую каждый пользователь заработал за месяц, когда он завершил свою работу (DateCompleted)
  2. Подсчитать все работы в базе данных, если они были отправлены в текущий месяц (Отправлено)
  3. Подсчитать все задания для текущего пользователя, если они были отправлены в текущем месяце (Отправлено)

У меня есть следующее

SELECT

SUM(case when j.Progress = 5 and (DateCompleted between  DATE_FORMAT(NOW() ,'%Y-%m-01') AND NOW() ) then j.Amount else 0 end) as Earned,

(SELECT COUNT(*) FROM Jobs WHERE (Submitted between DATE_FORMAT(NOW() ,'%Y-%m-01') AND NOW() )) as AllJobs,

COUNT(case when (Submitted between DATE_FORMAT(NOW() ,'%Y-%m-01') AND NOW() ) then 1 else 0 end) as UserJobs

FROM Jobs j
LEFT JOIN Staff s
ON s.StaffID = j.StaffID
WHERE j.StaffID = s.StaffID
AND StaffID = '631613'
LIMIT 1

В то время как Earned и AllJobs возвращают правильные значения, UserJobs показывает задания за пределами этого диапазона дат.

1 Ответ

1 голос
/ 20 февраля 2020

Я подозреваю, что условное COUNT() должно быть SUM():

sum(case when Submitted between DATE_FORMAT(NOW() ,'%Y-%m-01') AND NOW() then 1 else 0 end) as UserJobs

Обоснование: COUNT() учитывает все ненулевые значения; поэтому независимо от того, является ли условное выражение внутри возвращаемого значения 0 или 1, оно все равно учитывается, что, скорее всего, не то, что вам нужно.

Обратите внимание, что, поскольку вы используете MySQL Кроме того, вы могли бы упростить:

SUM(Submitted between DATE_FORMAT(NOW() ,'%Y-%m-01') AND NOW()) as UserJobs

Другие проблемы или возможные улучшения в вашем запросе:

  • StaffID неоднозначно в предложении where, поскольку это Столбец существует в обеих объединяемых таблицах

  • limit 1 является излишним в этом агрегированном запросе, в котором нет предложения group by (гарантированно будет возвращаться либо 0, либо 1 строка)

  • вложенные скобки вокруг условий не нужны

  • должна быть возможность использовать условное агрегирование полностью, а не подзапрос для вычисления AllJobs, перемещая фильтрация по StaffID из условия where в условия внутри агрегатных функций - но это трудно оценить, не видя фактических структур таблиц и данных

...