【问题标题】:SQL Server stored procedure doubling all valuesSQL Server存储过程将所有值加倍
【发布时间】:2019-01-16 09:19:26
【问题描述】:

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

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 

【问题讨论】:

  • 您是否尝试过在 SQL SERVER 管理中运行 SP?加倍发生在哪里?在 SP 中还是在您的程序代码中?
  • 是的,当我在 SQL SERVER MANAGEMENT 中运行它时它会翻倍,我还没有将它连接到我的程序。
  • 为什么要使用左连接?内连接会产生不同的错误数据吗?
  • INNER 不显示空值。但这并不是导致翻倍的原因。
  • 谢谢你们,这是我的问题。我有两名员工,这就是它翻倍的原因。

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


【解决方案1】:

您的子查询(JobRegular、JobOvertime)没有连接条件 - 您是说将 EmployeeJobs 连接到员工,但没有说明如何。所以它做了一个交叉连接 - 每个员工记录都与每个工作记录连接。我很惊讶它只会翻倍。您需要更多类似的东西 - 这是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多