MS在查询查询中访问“重复计数”

时间:2013-03-19 11:46:31

标签: ms-access

道歉,如果这个问题有点长,但我想详细解释一下我的目的是什么。

我正在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日(YTD)。

这些日期以ReportCentre的形式正确计算。我有三个查询可以返回不同日期范围的LRO:QueryLROMonthQueryLROPreviousQueryLROYTD所有这些都可以单独正常工作(即返回正确的值)。例如,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

A picture is worth a thousand words...

到目前为止一切都那么好,但现在这让我感到困惑。我正在尝试设计另一个查询,该查询获取三个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列相乘,因此lrocountmonthlrosecondsmonth都会乘以lrocountytd。同样,lrocountytdlrosecondsytd都会乘以lrocountmonth

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

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

1 个答案:

答案 0 :(得分:1)

您的[QueryLROMonth]和[QueryLROYTD]查询每个工具返回多行,但由于您实际上仅在Facility_ID上加入它们,因此您正在生成各种类型的OUTER JOIN。例如,如果对于给定的Facility,您的[Month]查询包含3行,而您的[YTD]查询包含6行,那么仅在Facility_ID上的JOIN将产生18行。

您需要创建聚合查询,首先按工具“汇总”每月和年初至今的数字,这样每个工具每个工具只有一行。然后,您可以在最终查询中使用他们来生成报告。

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