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;
注意最后一列我引用了查询的新列别名而不是再次重复子查询。
我有一个 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;
注意最后一列我引用了查询的新列别名而不是再次重复子查询。