1

如果这个问题有点长,我很抱歉,但我想详细解释一下我正在尝试做什么。

我正在 MS Access 2010/Windows 7 中开发一个数据库,用于分析和报告组织中的事件(例如故障)。事件被报告为在特定位置的特定日期/时间开始特定持续时间。一个事件可能偶尔会导致一个或多个“实时弹性中断”(LRO),它们将具有相同的开始时间,但可能位于不同的位置并具有不同的持续时间。因此,例如,中央技术区的路由器停止服务 600 秒可能会分别导致工作室 5 和 6 的实时中断 60 秒和 30 秒。

我需要报告三个日期范围:相关月份、上个月和(财务,从 4 月开始)年初至今。例如,2012 年 3 月的报告将考虑 2012 年 3 月 1 日至 2012 年 3 月 31 日(月)、2012 年 2 月 1 日至 2012 年 2 月 29 日(之前)和 2011 年 4 月 1 日至 2012 年 3 月 31 日(年初至今)期间。

这些日期在名为 ReportCentre 的表单中正确计算。我有三个查询来返回不同日期范围的 LRO:QueryLROMonthQueryLROPrevious并且QueryLROYTD所有这些查询都可以单独正常工作(即返回正确的值)。所以例如QueryLROMonth定义为

SELECT lro.*
FROM lro INNER JOIN incidents ON lro.pid = incidents.id
WHERE (((incidents.begin) Between [Forms]![ReportCentre].[StartMonth] And 
         [Forms]![ReportCentre].[EndMonth]));

它返回预期值:

id  pid duration    facility
6   681   30            23
7   686  857            23
8   735  600            25
9   738  600            25

与 YTD 查询一样

id  pid duration    facility
1   100 120     25
2   366 5       25
3   380 460     1
4   505 341     23
5   622 0       29
6   681 30      23
7   686 857     23
8   735 600     25
9   738 600     25
20  1297    50      1

一张图片胜过千言万语...

到目前为止一切顺利,但现在让我感到困惑的是。我正在尝试设计另一个查询,它获取三个 LRO 查询(和其他一些数据)的输出,按设施对它们进行分组并计算可用性等内容。如果我设计一个总计查询并包括Facilities表(用于设施名称)和QueryLROMonth查询,例如

SELECT facilities.facility, Count(QueryLROMonth.id) AS lrocountmonth, Sum(QueryLROMonth.duration) AS lrosecondsmonth
FROM QueryLROMonth INNER JOIN facilities ON QueryLROMonth.facility = facilities.ID
GROUP BY facilities.facility;

这工作正常并产生我所期望的。

facility    lrocountmonth   lrosecondsmonth
HQ3         2               887
HQ5         2               1200

但是一旦我介绍了 YTD 查询:

SELECT facilities.facility, Count(QueryLROMonth.id) AS lrocountmonth, Sum(QueryLROMonth.duration) AS lrosecondsmonth, Count(QueryLROYTD.id) AS lrocountytd, Sum(QueryLROYTD.duration) AS lrosecondsytd
FROM QueryLROYTD INNER JOIN (QueryLROMonth INNER JOIN facilities ON QueryLROMonth.facility = facilities.ID) ON QueryLROYTD.facility = facilities.ID
GROUP BY facilities.facility;

由于某种原因,东西开始被错误地报告。具体来说,这两Count列相乘在一起,所以lrocountmonth并且lrosecondsmonth都乘以lrocountytd。同样lrocountytdlrosecondsytd都乘以lrocountmonth

facility    lrocountmonth   lrosecondsmonth lrocountytd lrosecondsytd
HQ3     6       2661        6       2456
HQ5     8       4800        8       2650

我究竟做错了什么?如何防止这种纠缠?

4

1 回答 1

1

您的 [QueryLROMonth] 和 [QueryLROYTD] 查询每个都返回每个 Facility 的多行,但是因为您只是在 Facility_ID 上有效地将它们连接起来,所以您正在生成各种 OUTER JOIN。例如,如果对于给定的设施,您的 [Month] 查询包含 3 行,而您的 [YTD] 查询包含 6 行,那么仅 Facility_ID 上的 JOIN 将产生 18 行。

您需要创建聚合查询,首先按设施“汇总”每月和 YTD 数字,因此它们每个设施只有一行。然后,您可以在最终查询中使用它们来生成报告。

故障排除提示:如果您的聚合查询产生奇怪的结果,请尝试删除 GROUP BY 部分,以便您可以看到正在聚合的基础行。

于 2013-03-19T13:11:51.337 回答