MS Access按日期分组查询:获取当日最终库存与调整总和
MS Access 库存调整日志SQL查询问题
我在MS Access中有一张名为tbl_adj_logs的表,结构包含ID、EAN、CrtStock、Adjustment、AdjDate字段,用于记录库存调整操作的相关数据。每次库存调整时,系统会保存EAN、更新后的库存CrtStock、调整值Adjustment及调整日期AdjDate。
我需要编写一条SQL查询,按日期分组,获取指定EAN(值来自表单控件[Forms]![frm_Main]![search_ean_input])的当日最终库存、当日所有调整值的总和,输出字段需要包含EAN、FinalStock、SumOfAdjustment、AdjDate,用来生成图表。
我尝试了以下SQL语句但未成功:
SELECT a.CrtStock, DateValue(a.AdjDate), SUM(b.Adjustment) AS SumOfAdj FROM tbl_adj_logs AS a INNER JOIN tbl_adj_logs AS b ON DateValue(a.AdjDate) = DateValue(b.AdjDate) WHERE a.ID = ( SELECT MAX(c.ID) FROM tbl_adj_logs AS c WHERE c.EAN = [Forms]![frm_Main]![search_ean_input] AND DateValue(c.AdjDate) = DateValue(a.AdjDate) ) GROUP BY a.CrtStock, DateValue(a.AdjDate) ORDER BY DateValue(a.AdjDate);
修正后的SQL查询方案
要实现需求,可通过两个子查询分别处理当日最终库存和调整总和,再关联结果:
SELECT t.EAN, t.FinalStock, s.SumOfAdjustment, t.AdjDate FROM ( -- 获取每日最后一次调整的库存(当日最终库存) SELECT EAN, CrtStock AS FinalStock, DateValue(AdjDate) AS AdjDate FROM tbl_adj_logs WHERE ID IN ( SELECT MAX(ID) FROM tbl_adj_logs WHERE EAN = [Forms]![frm_Main]![search_ean_input] GROUP BY DateValue(AdjDate) ) AND EAN = [Forms]![frm_Main]![search_ean_input] ) AS t INNER JOIN ( -- 按日期分组计算当日调整总和 SELECT DateValue(AdjDate) AS AdjDate, SUM(Adjustment) AS SumOfAdjustment FROM tbl_adj_logs WHERE EAN = [Forms]![frm_Main]![search_ean_input] GROUP BY DateValue(AdjDate) ) AS s ON t.AdjDate = s.AdjDate ORDER BY t.AdjDate;
关键说明
- 子查询
t:通过分组日期取每日最大ID(对应当日最后一次调整记录),提取该记录的库存值作为当日最终库存FinalStock; - 子查询
s:按日期分组,直接统计指定EAN当日所有调整值的总和SumOfAdjustment; - 最后将两个子查询按日期关联,得到符合要求的完整字段集,同时确保只筛选目标EAN的数据。
这种写法逻辑清晰,避免原查询自关联导致的重复计算问题,完全适配Access SQL语法。
内容的提问来源于stack exchange,提问作者Trax
相关产品推荐
相关产品推荐

