Mysql SQL查询的结果给出了奇怪的结果

Mysql SQL查询的结果给出了奇怪的结果,mysql,sql,Mysql,Sql,我有两张桌子。一个叫做销售,另一个叫做Uren。销售表中的每个条目代表一次销售,销售完成时的最终日期为,Uren表中的每个条目代表代理人的班次,包含班次结束时的工作小时数和日期数据。这些表如下所示: SELECT agent, (SELECT SUM(case when finalized_at BETWEEN '2020-01-01 00:00:00' AND '2020-01-31 23:59:59' AND agent=Sales.agent then 1 else 0 end) FROM

我有两张桌子。一个叫做销售,另一个叫做Uren。销售表中的每个条目代表一次销售,销售完成时的最终日期为,Uren表中的每个条目代表代理人的班次,包含班次结束时的工作小时数和日期数据。这些表如下所示:

SELECT agent, (SELECT SUM(case when finalized_at BETWEEN '2020-01-01 00:00:00' AND '2020-01-31 23:59:59' AND agent=Sales.agent then 1 else 0 end) FROM Sales WHERE agent=Sales.agent AND finalized_at BETWEEN '2020-01-01 00:00:00' AND '2020-01-31 23:59:59')/(SELECT SUM(uren) FROM Uren WHERE datum BETWEEN '2020-01-01 00:00:00' AND '2020-01-31 23:59:59' AND agent=Sales.agent) as sph FROM Sales WHERE finalized_at BETWEEN '2020-01-04 00:00:00' AND '2020-01-04 23:59:59' GROUP BY agent ORDER by sph DESC;
销售表

+-------+--------------+
| agent | finalized_at |
+-------+--------------+
| John  | 01-01-2020   |
+-------+--------------+
| John  | 02-01-2020   |
+-------+--------------+
| Mark  | 01-01-2020   |
+-------+--------------+
| Peter | 01-01-2020   |
+-------+--------------+
| John  | 04-01-2020   |
+-------+--------------+
乌伦表

+-------+-------+------------+
| agent | hours | datum      |
+-------+-------+------------+
| John  | 1     | 01-01-2020 |
+-------+-------+------------+
| John  | 5     | 02-01-2020 |
+-------+-------+------------+
| Mark  | 1     | 01-01-2020 |
+-------+-------+------------+
| Peter | 2     | 01-01-2020 |
+-------+-------+------------+
| John  | 4     | 04-01-2020 |
+-------+-------+------------+
为了计算1月4日代理人的佣金,我必须考虑代理人在本月剩余时间的表现。为了做到这一点,我需要计算整个月每小时的销售额,但只计算在1月4日进行销售的代理商的销售额

我的查询如下所示:

SELECT agent, (SELECT SUM(case when finalized_at BETWEEN '2020-01-01 00:00:00' AND '2020-01-31 23:59:59' AND agent=Sales.agent then 1 else 0 end) FROM Sales WHERE agent=Sales.agent AND finalized_at BETWEEN '2020-01-01 00:00:00' AND '2020-01-31 23:59:59')/(SELECT SUM(uren) FROM Uren WHERE datum BETWEEN '2020-01-01 00:00:00' AND '2020-01-31 23:59:59' AND agent=Sales.agent) as sph FROM Sales WHERE finalized_at BETWEEN '2020-01-04 00:00:00' AND '2020-01-04 23:59:59' GROUP BY agent ORDER by sph DESC;
出于某种原因,在运行查询时,第二列sales返回sales表中的行总数,而不是使用where子句


所以我的问题是。我做错了什么?

只要去掉引用Sales表的子查询即可

+-------+--------------+
| agent | finalized_at |
+-------+--------------+
| John  | 01-01-2020   |
+-------+--------------+
| John  | 02-01-2020   |
+-------+--------------+
| Mark  | 01-01-2020   |
+-------+--------------+
| Peter | 01-01-2020   |
+-------+--------------+
| John  | 04-01-2020   |
+-------+--------------+

我将通过各自的代理分别预查询每个表并加入它们

SELECT 
      AgentHrs.Agent,
      AgentHrs.TotHours,
      coalesce( AgentCnt.NumberSales, 0 ) NumberSales,
      coalesce( AgentCnt.NumberSales, 0 ) / AgentHrs.TotHours as sph
  FROM 
     ( select agent, SUM(uren) TotHours
          from uren
          group by agent ) AgentHrs
     LEFT JOIN
        ( select agent, count(*) NumberSales
             from Sales
             group by agent ) AgentCnt
           on AgentHrs.Agent = AgentCnt.Agent
   ORDER BY 
      sph DESC;
我把预查询的代理工时汇总放在这里的第一位,因为除非你工作过,否则你可能无法销售。因此,必须保证工作时间。第二个是与实际销售额的左连接。仅仅因为有人工作并不意味着他们会得到销售。因此,您可以在4小时内完成0次销售,每小时完成0次销售。

联合销售是一种简单的方法:

select agent, sum(sales), sum(hours), sum(sales) / sum(hours
from ((select agent, 1 as sales, 0 as hours
       from sales
      ) union all
      (select agent, 0, hours
       from uren
      )
     ) us
group by agent;
您可以尝试此选择代理,销售,销售/销售作为sph从选择s.agent,计数*作为销售,销售s中的SUMuren s_uren,其中u.agent=s.agent按u.agent分组或按3描述订购;这将首先计算所有符号,然后计算所需数据。SUMuren?应该是三个小时吗?