SQL Server存储过程将所有值加倍

时间:2018-08-09 02:33:49

标签: sql sql-server left-join inner-join

这是我的存储过程,它似乎正在从表中提取所有正确的值,但由于某种原因,它使所有小时数加倍,从而使所有值加倍。我不知道我在哪里出问题了,任何帮助将不胜感激。

SELECT  
    FirstName, LastName,
    JobRegular.RegularHours AS RegularHours,
    JobRegular.RegularHours * dbo.Employees.Wage AS RegularPay,
    JobRegular.OvertimeHours AS OvertimeHours,
    JobRegular.OvertimeHours * dbo.Employees.Wage AS OvertimePay,
    JobOvertime.CBRegularHours AS CBRegularHours,
    JobOvertime.CBRegularHours * dbo.Employees.Wage AS CBRegularPay,
    JobOvertime.CBOvertimeHours AS CBOvertimeHours,
    JobOvertime.CBOvertimeHours * dbo.Employees.Wage AS CBOvertimePay
FROM 
    dbo.Employees
INNER JOIN 
    (SELECT  
         dbo.EmployeeJobs.EmployeeId,
         SUM(dbo.EmployeeJobs.RegularHours) AS RegularHours,
         SUM(dbo.EmployeeJobs.RegularHours) * MIN(dbo.Employees.Wage) AS RegularPay,
         SUM(dbo.EmployeeJobs.OvertimeHours) As OvertimeHours, 
         SUM(dbo.EmployeeJobs.OvertimeHours) * MIN(dbo.Employees.Wage) As OvertimePay
     FROM 
         dbo.EmployeeJobs, dbo.Employees
     WHERE 
         dbo.EmployeeJobs.ComputerCodeId IN (7,8,9,13,14,15,16,17,18,19,22)
     GROUP BY 
         dbo.EmployeeJobs.EmployeeId) AS JobRegular ON dbo.Employees.EmployeeId = JobRegular.EmployeeId 
LEFT JOIN 
    (SELECT  
         dbo.EmployeeJobs.EmployeeId,
         SUM(dbo.EmployeeJobs.RegularHours) As CBRegularHours,
         SUM(dbo.EmployeeJobs.RegularHours) * MIN(dbo.Employees.Wage) AS CBRegularPay,
         SUM(dbo.EmployeeJobs.OvertimeHours) AS CBOvertimeHours,
         SUM(dbo.EmployeeJobs.OvertimeHours) * MIN(dbo.Employees.Wage) As CBOvertimePay
     FROM  
         dbo.EmployeeJobs, dbo.Employees
     WHERE 
         dbo.EmployeeJobs.ComputerCodeId IN (4,5,6)
     GROUP BY 
         dbo.EmployeeJobs.EmployeeId) AS JobOvertime ON dbo.Employees.EmployeeId = JobOvertime.EmployeeId 

1 个答案:

答案 0 :(得分:2)

您的子查询(JobRegular,JobOvertime)没有联接条件-您说的是将EmployeeJobs加入到Employees,但是没有说如何。因此,它进行交叉连接-每个员工记录都与每个工作记录都相连接。我很惊讶它只是增加了一倍。您需要更多类似的东西-这是JobRegular,JobOvertime也需要修复。 (此外,开始使用表别名,这将使它更具可读性)

SELECT  dbo.EmployeeJobs.EmployeeId,
        SUM(dbo.EmployeeJobs.RegularHours) AS RegularHours,
        SUM(dbo.EmployeeJobs.RegularHours) * MIN(dbo.Employees.Wage) AS RegularPay,
        Sum(dbo.EmployeeJobs.OvertimeHours) As OvertimeHours, 
        SUM(dbo.EmployeeJobs.OvertimeHours) * MIN(dbo.Employees.Wage) As OvertimePay
FROM dbo.EmployeeJobs 
    inner join dbo.Employees on dbo.Employees.EmployeeId = dbo.EmployeeJobs.EmployeeId
WHERE dbo.EmployeeJobs.ComputerCodeId IN (7,8,9,13,14,15,16,17,18,19,22)
GROUP BY dbo.EmployeeJobs.EmployeeId

已编辑-实际上,您完全不需要子查询中的员工,将其删除

SELECT  dbo.EmployeeJobs.EmployeeId,
        SUM(dbo.EmployeeJobs.RegularHours) AS RegularHours,
        SUM(dbo.EmployeeJobs.RegularHours) * MIN(dbo.Employees.Wage) AS RegularPay,
        Sum(dbo.EmployeeJobs.OvertimeHours) As OvertimeHours, 
        SUM(dbo.EmployeeJobs.OvertimeHours) * MIN(dbo.Employees.Wage) As OvertimePay
FROM dbo.EmployeeJobs 
WHERE dbo.EmployeeJobs.ComputerCodeId IN (7,8,9,13,14,15,16,17,18,19,22)
GROUP BY dbo.EmployeeJobs.EmployeeId