You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MS Access数据库查询运行报错求助:库存计算SQL语句修复

MS Access查询报错排查与解决方案

报错原因分析

核心问题有两点:

  1. 聚合规则违反:tblproduct.pc字段出现在计算表达式中,但既未加入GROUP BY子句,也没有用聚合函数包裹,不符合Access对聚合查询的要求。
  2. 笛卡尔积导致统计失真:直接将采购表和销售表同时关联到产品表,会产生交叉匹配(同一产品有多条采购/销售记录时),导致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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:42:46