我正在尝试提取工作时间总和,并将其与为每个员工支付的总工作时间进行比较。这些存储在两个不同的表中。当我分别将表查询到2个不同的表中时,它们可以完美地工作。当我将它们放在相同的查询中时,结果就差强人意了。
示例数据支付交易: PayrollTransactions
这是行不通的查询:
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
答案 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