MS Access数据库查询运行报错求助:库存计算SQL语句修复
MS Access查询报错排查与解决方案
报错原因分析
核心问题有两点:
- 聚合规则违反:
tblproduct.pc字段出现在计算表达式中,但既未加入GROUP BY子句,也没有用聚合函数包裹,不符合Access对聚合查询的要求。 - 笛卡尔积导致统计失真:直接将采购表和销售表同时关联到产品表,会产生交叉匹配(同一产品有多条采购/销售记录时),导致
SUM()计算的数值被重复统计,结果不准确。
修复方案
方案1:临时修复语法错误(可运行但逻辑存在隐患)
因同一itemname对应的pc值通常唯一,用MAX()或MIN()包裹该字段,满足Access聚合规则:
select tblproduct.itemname As Item_Name, ((sum(tblpurchase.[case]) * MAX(tblproduct.pc)) - ((sum(tblsale.[case]) * MAX(tblproduct.pc)) + sum(tblsale.nos))) As Remaining_Stock From (tblproduct left Join tblpurchase on tblproduct.itemname=tblpurchase.itemname) left join tblsale on tblproduct.itemname = tblsale.itemname where tblproduct.itemname='Combo Soap' group by tblproduct.itemname
方案2:修正逻辑(推荐,避免统计错误)
先分别聚合采购、销售数据,再关联到产品表,彻底避免交叉匹配问题:
SELECT p.itemname AS Item_Name, ((ISNULL(pur.Total_Case, 0) * p.pc) - ((ISNULL(sal.Total_Sale_Case, 0) * p.pc) + ISNULL(sal.Total_Sale_Nos, 0))) AS Remaining_Stock FROM tblproduct p LEFT JOIN ( SELECT itemname, SUM([case]) AS Total_Case FROM tblpurchase GROUP BY itemname ) pur ON p.itemname = pur.itemname LEFT JOIN ( SELECT itemname, SUM([case]) AS Total_Sale_Case, SUM(nos) AS Total_Sale_Nos FROM tblsale GROUP BY itemname ) sal ON p.itemname = sal.itemname WHERE p.itemname = 'Combo Soap'
该方案额外用ISNULL()处理空值,防止某表无对应记录时计算结果为空。
内容的提问来源于stack exchange,提问作者Mantu Swain
相关产品推荐
相关产品推荐

