【问题标题】:Need a query to find employees that have not paid into retirement需要查询以查找尚未支付退休金的员工
【发布时间】:2013-02-02 05:04:06
【问题描述】:

我在这里的第一篇文章,希望能得到一些帮助。我需要创建一份报告,显示从未支付退休金的员工。我需要从 3 个表中提取信息。如果员工有特定的扣除代码(7001 到 7006),则他们已支付退休金。我有以下表格和列。

Employee
Employee.empid
Employee.fname
Employee.lname
Employee.jobclass


EarnHistory
EarnHistory.empid
EarnHistory.hoursworked
EarnHistory.checknumber
EarnHistory.checkdate


DeductionHistory
DeductionHistory.empid
DeductionHistory.deductioncode
DeductionHistory.checknumber
DeductionHistory.checkdate

查询需要拉入empid, fname, lname, hoursworked, deductioncode 员工从未支付过扣除代码 7001 至 7006。

我尝试使用 NOT EXISTS 失败

【问题讨论】:

  • 哪个 SQL Server?有fiddle吗?
  • 您应该包含您的无效查询,这样有人可以尝试解释它为什么无效以及更好的方法。
  • SQL Server 2008。你的权利,我应该发布原始查询。我会在我回到办公室后发布查询。

标签: sql


【解决方案1】:

这样的事情应该可以工作:

SELECT E.empid, E.fname, E.lname, EH.hoursworked, DH.deductioncode
FROM Employee E
   INNER JOIN EarnHistory EH ON E.empid = EH.empid
   INNER JOIN DeductionHistory DH ON E.empid = DH.empid
   LEFT JOIN DeductionHistory DH2 ON E.empid = DH2.empid 
       AND DH2.deductioncode IN (7001,7002,7003,7004,7005,7006)
WHERE DHD2.empid IS NULL

这取决于您的 deductioncode 数据类型。您可以使用 BETWEEN、,或者如果为 varchar,则添加撇号。

你也可以使用NOT EXISTS:

SELECT E.empid, E.fname, E.lname, EH.hoursworked, DH.deductioncode
FROM Employee E
   INNER JOIN EarnHistory EH ON E.empid = EH.empid
   INNER JOIN DeductionHistory DH ON E.empid = DH.empid
WHERE NOT EXISTS (SELECT * 
                  FROM DeductionHistory 
                  WHERE deductioncode IN (7001,7002,7003,7004,7005,7006)
                     AND E.empid = DeductionHistory.empid)

祝你好运。

【讨论】:

  • 我会试试 NOT EXISTS 子句。我又忘记了一个细节。我还需要将结果限制为具有某些类型薪酬的员工。 EarnHistory 表中有一个名为 paytype 的列,我需要将结果限制为 paytype 100 到 150。
  • 只需在您的 WHERE 条件中添加:WHERE EH.PayType BETWEEN 100 AND 150 AND(假设它是数字数据类型)...或者您可以将其链接到您的 JOIN 中。祝你好运。
【解决方案2】:
select Employee.empid, Employee.fname , Employee.lname,EarnHistory.hoursworked,           DeductionHistory.deductioncode from Employee 
    join EarnHistory using('empid')  
    join DeductionHistory using('empid')  
    LEFT JOIN DeductionHistory dh ON Empployee.empid = dh.empid 
    AND DH.deductioncode IN (7001,.......,7006)
    WHERE DHD.empid IS NULL

【讨论】:

    【解决方案3】:
    SELECT E.empid, E.fname, E.lname, EH.hoursworked, DH.deductioncode
      FROM Employee E, EarnHistory EN, DeductionHistory DH
     WHERE E.empid = EH.empid
       AND E.empid = DH.empid
       AND E.empid <> (SELECT empid
                         FROM DedutionHistory
                        GROUP BY empid 
                       HAVING deductioncode >= 7001
                          AND deductioncode <= 7006)
    

    【讨论】:

      猜你喜欢
      • 2014-01-23
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 2022-07-12
      相关资源
      最近更新 更多