如果这个问题有点长,我很抱歉,但我想详细解释一下我正在尝试做什么。
我正在 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:QueryLROMonth
,QueryLROPrevious
并且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
。同样lrocountytd
和lrosecondsytd
都乘以lrocountmonth
。
facility lrocountmonth lrosecondsmonth lrocountytd lrosecondsytd
HQ3 6 2661 6 2456
HQ5 8 4800 8 2650
我究竟做错了什么?如何防止这种纠缠?