【问题标题】:Table Joins is not returning accurate results; any ideas why?表连接没有返回准确的结果;任何想法为什么?
【发布时间】:2015-05-10 01:37:04
【问题描述】:

每年,我们部门都会征求员工的捐款,以帮助支持癌症研究、药物和酒精等方面的研究。

我们已经建立了一个系统来帮助减轻员工的捐款压力。

目前,我们有与我目前遇到的这个问题相关的表格。

它们是emp、dept 和contribution 表。

Emp 表包含我们组织中所有员工的列表。

Dept 表包含部门列表。

最后,每次员工缴费时,员工的ID和缴费日期(date_stamp)都会记录在缴费表中。

每位员工都要求填写此表格,无论她/他是否做出贡献。员工可以选择捐款,或选中“我目前不希望捐款”的复选框

我的任务是提供一份未填写表格的员工名单。

如果雇员 ID 在 emp 表上但不在当年的供款表上(date_stamp),则该雇员尚未填写表格。

到目前为止,我的查询返回了 emp 表中未填写表格的员工中不到一半。我们希望此代码返回 emp 表中尚未在本年度供款表中的那些员工的列表。

现在,由于贡献季节从 2012 年 11 月 27 日开始,我们希望此查询返回 emp 表上的所有员工。

非常感谢您的帮助。

SELECT  e.lastname, e.firstname,CASE active WHEN 1 then 'Yes'WHEN 0 then 'No' else 'other'END
FROM contributions c
LEFT JOIN emp e ON e.employee_id = c.employee_id
INNER JOIN dept d ON d.dept_code = e.dept_code
WHERE Year(c.date_stamp) <> '2010' OR Year(c.date_Stamp) <> '2011' OR Year(c.date_Stamp) <> '2012'
GROUP BY e.lastname,e.firstname, e.employee_id, active
ORDER By e.lastname;

【问题讨论】:

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

如果我理解正确的话,你需要这样的东西

select
    e.lastname, e.firstname
from emp as e
where
    e.employee_id not in
    (
         select c.employee_id
         from contributions as c
         where c.date_stamp >= convert(datetime, '20121127', 112)
    )

【讨论】:

  • 也看看 EXISTS 语句。
  • 要考虑贡献表,我们可以对其进行左连接
  • @IoanaIonasek 是的,但在这种情况下,我们需要所有不在贡献表中的记录,所以我认为not in 对阅读我们查询的人来说更清楚:)
【解决方案2】:

尝试使用 EXISTS

选择 e.lastname, e.firstname,CASE active WHEN 1 then 'Yes'WHEN 0 then 'No' else 'other'END 来自 emp e,dept d 其中 d.dept_code = e.dept_code 并且不存在(从 c.employee_id = e.employee_id 的贡献中选择“x”)

希望对您有所帮助。

【讨论】:

  • 非常感谢专家的及时回复。对此,我真的非常感激。 @Godfre,您的代码运行良好,Roman Pekar 的运行更好,因为它捕获了 emp 表中的所有记录。
  • 没关系@ChidiOkeh,没问题。
猜你喜欢
  • 1970-01-01
  • 2013-01-23
  • 2019-07-29
  • 2011-11-07
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多