MS Access:如何从聚合每月数据的查询中创建 YTD 历史记录 table?

MS Access: How can I create a YTD history table from a query that aggregates monthly data?

我有一个 table,我每个月都会添加该月的新数据记录(关键绩效指标)。 table 由 30 fields/columns 组成。出于这个问题的目的,我只包含三个字段。

Table: tbl_KPIMonth, Primary Key: YearMonth
YearMonth  OrderAmount   OrderLines  OrderLinesOnTime
201311     2500          350         330
201312     3000          400         390
201401     1000          100          95
201402      500          150         140
201403     2000          200         190
201404     1500          100          90

我有一个查询,将每个 field/column.

的每月数据汇总到当前年初至今 (YTD) 总数
SELECT Val(Left(m.YearMonth,4)) AS Year, Sum(m.OrderAmount) AS OrderAmountYTD, 
Sum(m.OrderLines) AS OrderLinesYTD, 
Sum(m.OrderLinesOnTime)/Sum(m.OrderLines) AS OnTimeDeliveryYTD
FROM tbl_KPIMonth AS m
WHERE Val(Left(m.YearMonth,4))=2014
GROUP BY Val(Left(m.YearMonth,4))

每个月我都想将 YTD 聚合数据添加到历史记录中 table 以显示度量的进度。预期结果应如下所示:

Table: tbl_HistKPIYear,  Primary Key: YearMonth
YearMonth   OrderAmountYTD   OrderLinesYTD   OnTimeDeliveryYTD
201401      1000             100             0.95
201402      1500             250             0.94
201403      3500             450             0.94
201404      5000             550             0.93

如果我包含 YearMonth 字段,则将上面的查询用作 INSERT 查询是行不通的,因为 GROUP BY m.YearMonth 会阻止聚合其余字段。
我必须在 YearMonth 上设置主键以避免重复。

INSERT INTO tbl_HistKPIYear (OrderAmountYTD, OrderLinesYTD, OnTimeDeliveryYTD)

SELECT Sum(m.OrderAmount) AS OrderAmountYTD, 
Sum(m.OrderLines) AS OrderLinesYTD, 
Sum(m.OrderLinesOnTime)/Sum(m.OrderLines) AS OnTimeDeliveryYTD
FROM tbl_KPIMonth AS m
WHERE Val(Left(m.YearMonth,4))=2014
GROUP BY Val(Left(m.YearMonth,4))

我怎样才能让 table tbl_HistKPIYear 中的字段 YearMonth 填充当前月份(例如 201404)?

您实际上需要一个累积查询,需要子查询才能实现同一年内每个月的 运行 总和。

请参阅下面的示例(我添加了 OrderLineYTD 以向您展示最后一列的计算方式):

SELECT t1.YearMonth, 

(SELECT SUM(t2.OrderAmount) FROM tbl_KPIMonth t2 
WHERE t2.YearMonth <= t1.YearMonth AND Left(t1.YearMonth, 4) = Left(t2.YearMonth, 4)) As OrderAmountYTD,

(SELECT SUM(t2.OrderLines) FROM tbl_KPIMonth t2 
WHERE t2.YearMonth <= t1.YearMonth AND Left(t1.YearMonth, 4) = Left(t2.YearMonth, 4)) As OrderLinesYTD,

(SELECT SUM(t2.OrderLinesOnTime) FROM tbl_KPIMonth t2 
WHERE t2.YearMonth <= t1.YearMonth AND Left(t1.YearMonth, 4) = Left(t2.YearMonth, 4)) As OrderLineOnTimeYTD,

([OrderLineOnTimeYTD] / [OrderLinesYTD]) As OnTimeDeliveryYTD

FROM tbl_KPIMonth t1;

注意最后一列我引用了查询的新列别名而不是再次重复子查询。