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;
已经设计 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;