1

この質問が少し長い場合は申し訳ありませんが、私がやろうとしていることを詳しく説明したかったのです。

私は、MS Access 2010/Windows 7 で、組織内のインシデント (障害など) を分析して報告するデータベースを開発しています。インシデントは、特定の期間、特定の場所で特定の日時に開始されたものとして報告されます。インシデントによって、1 つまたは複数の "ライブ レジリエンス停止" (LRO) が発生する場合があります。開始時刻は同じですが、場所と期間が異なる場合があります。たとえば、中央のテクニカル エリアでルーターが 600 秒間サービスを停止すると、スタジオ 5 と 6 でそれぞれ 60 秒と 30 秒のライブ停止が発生する可能性があります。

3 つの日付範囲についてレポートする必要があります: 問題の月、前の月、および (財務、4 月から始まる) 年初来です。たとえば、2012 年 3 月のレポートでは、2012 年 3 月 1 日から 2012 年 3 月 31 日 (月)、2012 年 2 月 1 日から 2012 年 2 月 29 日 (前)、2011 年 4 月 1 日から 2012 年 3 月 31 日 (YTD) の期間が考慮されます。

これらの日付は、ReportCentre というフォームで正しく計算されます。異なる日付範囲の LRO を返す 3 つのクエリが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

百聞は一見にしかず…

これまでのところは順調ですが、今は少し戸惑っています。3 つの 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;

何らかの理由で、誤って報告されたものがカウントされ始めます。具体的には、2 つのCount列が一緒に掛けられてlrocountmonthlrosecondsmonth両方とも で掛けられ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 の数値を最初に施設ごとに "ロールアップ" する集計クエリを作成して、施設ごとに 1 つの行のみを持つようにする必要があります。その後、それらを最終クエリで使用してレポートを作成できます。

トラブルシューティングのヒント: 集計クエリで奇妙な結果が生成される場合は、GROUP BY 部分を削除して、集計されている基になる行を確認できるようにしてください。

于 2013-03-19T13:11:51.337 に答える