SQL SUM()函数不适用于查询中的多个表

时间:2020-02-14 15:54:58

标签: sql ms-access

我正在尝试提取工作时间总和,并将其与为每个员工支付的总工作时间进行比较。这些存储在两个不同的表中。当我分别将表查询到2个不同的表中时,它们可以完美地工作。当我将它们放在相同的查询中时,结果就差强人意了。

示例数据支付交易: PayrollTransactions

enter image description here

PayrollTime

enter image description here

这是行不通的查询:

SELECT Emp_No, Sum(Regular_Hours) AS PaidRegHours, Sum(Overtime_Hours) AS PaidOTHours, Sum(Reg_Hours) AS ClockedRegHours, Sum(OT_Hrs) AS ClockedOTHours
FROM PayrollTransactions, PayrollTime
WHERE Employee_No = Emp_No
GROUP BY Emp_No;

它为1名雇员提取的结果是1000 PaidRegHours。仅从PayrollTransactions这样查询时:

SELECT Employee_No, Sum(Regular_Hours) AS PaidRegHours, Sum(Overtime_Hours) AS PaidOTHours
FROM PayrollTransactions
GROUP BY Employee_No;

同一位雇员的结果是200 PaidRegHours,这是正确的。我所有的计算字段都存在相同的问题。我不确定如何解决此问题。感谢您的帮助!

所需结果: DesiredOutput

enter image description here

1 个答案:

答案 0 :(得分:1)

JOIN倍数的经典问题。通过查询这两个在员工上具有多对多关系的表,您将返回多个配对(即重复项,三胞胎,四倍体),然后将它们汇总在一起,将实际的200小时总计为1,000。相反,可以考虑一对一联接,这可以通过联接两个表的聚合来实现。

以下使用子查询,但也可以使用存储的查询。另外,使用显式JOIN(当前的ANSI SQL标准),而不是像当前使用WHERE那样隐式联接。

SELECT p.Employee_No, p.PaidRegHours, p.PaidOTHours, t.ClockedRegHours, t.ClockedOTHours
FROM
   (SELECT Employee_No, 
           Sum(Regular_Hours) AS PaidRegHours, 
           Sum(Overtime_Hours) AS PaidOTHours
    FROM PayrollTransactions
    GROUP BY Employee_No) p
INNER JOIN
   (SELECT Emp_No, 
           Sum(Reg_Hours) AS ClockedRegHours, 
           Sum(OT_Hrs) AS ClockedOTHours
    FROM PayrollTime
    GROUP BY Emp_No) t
  ON p.Employee_No = t.Emp_No

或者,对于存储的查询,有时使用Access的引擎可能更有效:

SELECT p.Employee_No, p.PaidRegHours, p.PaidOTHours, t.ClockedRegHours, t.ClockedOTHours
FROM qryPayrollTransactionsAgg p
INNER JOIN qryPayrollTimeAgg t
  ON p.Employee_No = t.Emp_No