Return 数据不存在的数据

Return data where data doesn't exist

已经设计 SQL 报告一周了。请温柔点

我正在设计一份报告,供我们使用的应用程序使用。我想 return 列出所有员工及其所有工作时间。如果员工没有记录时间,我仍然希望他们显示 0.00 或没有时间。我可以在 SQL 设计器中设计和预览报告并且它有效。

在添加 WHERE conditions/Macros 并将其加载到应用程序时,它不会显示任何时间都没有记录的员工。

以下是我在正确设置 WHERE 子句方面最成功的尝试。但是,如果我 运行 一周没有人记录任何时间的报告,它只会 return 大约 1/3 的员工 & 我不明白为什么!

SELECT CAST(1 AS bit) AS IsTimeEntry
     , Employees.Name
     , TimeEntries.EntryDateTime
     , TimeEntries.Duration / 60 AS Duration
FROM Employees 
LEFT OUTER JOIN TimeEntries ON TimeEntries.Employee = Employees.ID
WHERE 
   (TimeEntries.EntryDateTime BETWEEN @FromDate AND @ToDate) 
   OR TimeEntries.Duration =0 
   OR TimeEntries.Duration IS NULL

将 WHERE 更改为 AND

SELECT        CAST(1 AS bit) AS IsTimeEntry, Employees.Name, 
TimeEntries.EntryDateTime, TimeEntries.Duration / 60 AS Duration
FROM Employees LEFT OUTER JOIN
     TimeEntries ON TimeEntries.Employee = Employees.ID
AND ((TimeEntries.EntryDateTime BETWEEN @FromDate AND @ToDate) 
 OR TimeEntries.Duration =0 OR TimeEntries.Duration IS NULL)

查询失败的原因是您将部分连接条件放在 WHERE 子句中,而不是 ON 子句中。

发生的情况是这样的:您找到员工 A(他有时间条目,但不在给定的时间范围内)。您在员工 A 的时间条目中找到了条目,因此您加入了他们。然后在您的 WHERE 子句中,您注意到找到的所有匹配项都在其他时间范围内,因此您将它们全部删除。您的结果集中没有员工 A 记录。

你想要发生的是:找到员工 A。找到他在给定范围内的所有时间条目。如果找到 none,则外连接 NULL 记录,以便将此员工保留在结果集中。

select
  cast(1 as bit) as istimeentry, 
  e.name, 
  t.entrydatetime, 
  t.duration / 60 as duration
from employees e
left outer join timeentries t
  on t.employee = e.id and t.entrydatetime between @fromdate and @todate;