SQL 连接查询以显示一个表中不存在行的行

far*_*ave 13 sql-server-2008 join sql-server reporting group-by

我正在尝试为员工时间记录完成一些报告。

我们有两个专门针对这个问题的表格。员工列在Members表中,他们每天输入他们已完成工作的时间条目并存储在Time_Entry表中。

使用 SQL Fiddle 的示例设置:http ://sqlfiddle.com/#!3/e3806/7

最终的结果我要的是一个表,表示所有Members列中的列表,然后将展示他们的总和小时,在其他列查询的日期。

问题似乎是,如果Time_Entry表中没有特定成员的行,那么该成员现在有行。我尝试了几种不同的连接类型(左、右、内、外、全外等),但似乎都没有给我想要的,这将是(基于 SQL Fiddle 中的最后一个示例):

/*** Desired End Result ***/

Member_ID   | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL
ADavis      | 0               | 11-10-2013    | 0               | 0
BTronton    | 0               | 11-10-2013    | 0               | 0
CJones      | 0               | 11-10-2013    | 0               | 0
DSmith      | 0               | 11-10-2013    | 0               | 0
EGirsch     | 1               | 11-10-2013    | 0.92            | 1
FRowden     | 0               | 11-10-2013    | 0               | 0
Run Code Online (Sandbox Code Playgroud)

当我查询 11-1 的特定日期时,我目前得到的是:

Member_ID   | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL
EGirsch     | 1               | 11-10-2013    | 0.92            | 1
Run Code Online (Sandbox Code Playgroud)

根据 EGirsch 日期为 11-10-2013 的一个 Time Entry 行,这是正确的,但我需要查看其他成员的零以获取报告并最终获得此信息的 Web 仪表板/报告。

这是我的第一个问题,虽然我搜索了 Join 查询等。老实说,我不确定这个函数可能被调用,所以我希望这不是重复的,并且会帮助其他人也试图找到解决方案类似的问题。

Aar*_*and 12

感谢您提供 SQLfiddle 和示例数据!我希望更多的问题以这种方式开始。

如果您想要所有成员,而不管他们是否有该日期的条目,您需要一个LEFT OUTER JOIN. 您与此版本非常接近,但是外连接的一个小技巧是,如果您向WHERE子句中的外表添加过滤器,则会将外连接转换为内连接,因为它将排除NULL该侧的任何行(因为它不知道是否NULL匹配过滤器)。

我修改了第一个查询以获取每个成员的一行:

SELECT Members.Member_ID
      ,Time_Entry.Date_Start
      ,Time_Entry.Hours_Actual
      ,Time_Entry.Hours_Bill
FROM dbo.Members
  LEFT OUTER JOIN dbo.Time_Entry
--^^^^ changed from FULL to LEFT
  ON Members.Member_ID = Time_Entry.Member_ID
  AND Time_Entry.Date_Start = '20131110';
--^^^ changed from WHERE to AND
Run Code Online (Sandbox Code Playgroud)

我将把它留作练习,让读者从那里拿走它并添加其他列、格式COALESCE等。

其他一些注意事项: