MS Access:每小时显示计数即使时间段内没有记录

问题描述

我被卡住了,我认为它应该很简单,但无法让它工作。我有一个包含一天中所有时间的“tbTiMetable”表。

tbTiMetable(只显示前5条记录,但会在23:00结束(共24条记录)

| ID | TimeStart | TimeStop |
|1   | 0:00      | 1:00     |
|2   | 1:00      | 2:00     |
|3   | 2:00      | 3:00     |
|4   | 3:00      | 4:00     |
|5   | 4:00      | 5:00     |

我有一个总计查询 qryPartCountTotalsPerHour,其中包含每小时的零件计数。

| DateIn   | PartCount | PeriodIn | PerdiodOut |
|19-5-2021 | 221       |0:00      | 1:00       |
|19-5-2021 | 203       |1:00      | 2:00       |
|19-5-2021 | 201       |2:00      | 3:00       |
|19-5-2021 | 215       |6:00      | 7:00       |
|19-5-2021 | 174       |7:00      | 8:00       |

我想要的是显示一天中所有小时的零件计数结果,如果该小时内没有记录,则在零件计数中显示 0。因此,DateIn 字段中的每个日期应至少显示 24 条记录。

我试过了:

SELECT qryPartCountTotalsPerHour.DateIn,qryPartCountTotalsPerHour.PartCount,qryPartCountTotalsPerHour.Periodout,qryPartCountTotalsPerHour.Periodout
FROM tbTiMetable LEFT JOIN qryPartCountTotalsPerHour ON tbTiMetable.TimeStart = qryPartCountTotalsPerHour.PeriodIn
ORDER BY qryPartCountTotalsPerHour.DateIn;

我还尝试使用 Hour() 函数将 PeriodIn 和 TimeStart 仅转换为“小时”,但没有任何效果。我在某处出错但找不到。

编辑:试图澄清 DateIn 包含多个日期。

解决方法

你很近。您需要按第一个表聚合:

SELECT t.PeriodIn,NZ(q.PartCount),q.PeriodOut,q.PeriodOut
FROM tbTimeTable as t LEFT JOIN 
     qryPartCountTotalsPerHour as q
     ON t.TimeStart = qryPqrtCountTotalsPerHour.PeriodIn
ORDER BY t.PeriodIn;

这适用于您的示例数据。如果涉及的天数越多,情况可能会变得更加复杂。

,

所以我找到了答案。这 topic 帮助我得到了答案,特别是来自 Ken Sheridan 和他的公共数据库“付款”的答案。这个数据库应该给你足够的信息来解决这个或类似的问题。不过,我会简要介绍一下我所做的。

所以我用时间表和所有日志日期(它们之间没有关系)创建了一个名为 qryCalendar 的查询。这导致了每个记录日期的完整时间表。

然后我创建了一个新查询来显示最终结果:

SELECT qryCalendar.Date,qryCalendar.TimeStop,qryCalendar.TimeStart,Nz([qryPartCountTotalsPerHour].[PartCount],0) AS tPartCount
FROM qryCalendar LEFT JOIN qryPartCountTotalsPerHour ON (qryCalendar.TimeStop = qryPartCountTotalsPerHour.PeriodOut) AND (qryCalendar.Date = qryPartCountTotalsPerHour.DateIn)
ORDER BY qryCalendar.Date,qryCalendar.TimeStart;