【问题标题】:Counting all values, a sum between one range and a count in another计算所有值,一个范围和另一个范围之间的总和
【发布时间】:2020-06-05 01:08:42
【问题描述】:

尝试运行执行三件事的查询。我希望它:

  1. 获取每个用户在完成任务的当月赚取的金额 工作(完成日期)
  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 显示的是此日期范围之外的工作。

【问题讨论】:

    标签: php mysql sql group-by count


    【解决方案1】:

    我怀疑条件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
    

    您的查询的其他问题或可能的改进:

    • StaffIDwhere 子句中不明确,因为该列存在于正在连接的两个表中

    • limit 1 在这个没有 group by 子句的聚合查询中是多余的(保证返回 0 或 1 行)

    • 条件周围的嵌套括号是不必要的

    • 应该可以一直使用条件聚合而不是子查询来计算 AllJobs,方法是将 StaffID 上的过滤从 where 子句移动到聚合函数内的条件 - 但是如果不查看实际的表结构和数据,这很难评估

    【讨论】:

    • 成功了,感激不尽。澄清一下,这是一个简化版的查询,不包含额外的细节。
    猜你喜欢
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多