【问题标题】:MS-Access: Calculate Stock From 3 TablesMS-Access:从 3 个表计算库存
【发布时间】:2020-08-17 04:43:47
【问题描述】:

我正在从StackOverFlow 阅读this post 以调整查询以从3 个表中计算库存。我有 3 张桌子 tblItemstblPurchasetblSalestblItems 包含如下项目信息。

ItemCode    Description                 ItemClass   ItemCategory        ReorderLevel    Unit    Stop
IT000001    Tonner 226A                 Tonner      IT Accessories      10              Pc(s)   No
IT000002    Keyborad (A4Tech, Slim Key) Keyboard    IT Accessories      10              Pc(s)   No
IT000003    Mouse (Wireless)            Mouse       IT Accessories      10              Pc(s)   No
SI000001    A4 Size Paper               Paper       Office Stationary   10              Pc(s)   No
SI000002    Pen (Black)                 Pen         Office Stationary   10              Pc(s)   No
SI000003    Pen (Blue)                  Pen         Office Stationary   10              Pc(s)   No

我的表格的屏幕截图

tblItems:

tblPurchase:

tblSales:

我的预期结果如下所示

查询结果中的项目详细信息将来自tblItems。将每件商品的购买数量和每件商品的销售数量相加,然后从 PurchaseQuantity 中减去 SalesQuantity 以查看库存。

这是我的查询,它给了我以下警告。

SELECT DISTINCTROW tblItems.ItemCode, TblItems.Description, TblItems.ItemClass, TblItems.ItemCategory, TblPurchaseAgg.[pQuantity], TblSalesAggs.[sQuantity]
FROM (TblItems 

LEFT JOIN (SELECT TblItems.ItemCode AS ItemCode, Sum(TblPurchase.Quantity) AS pQuantity FROM TblItems LEFT JOIN TblPurchase ON TblItems.ItemCode = TblPurchase.ItemCode GROUP BY TblItems.ItemCode)  
AS TblPurchaseAgg ON TblItems.ItemCode = TblPurchaseAgg.ItemCode) 

LEFT JOIN 

(SELECT TblItems.ItemCode AS ItemCode, Sum(tblSales.Quantity) AS sQuantity FROM TblItems LEFT JOIN tblSales ON TblItems.ItemCode = tblSales.ItemCode GROUP BY TblItems.ItemCode)  AS TblSalesAggs ON TblItems.ItemCode = TblSalesAggs.ItemCode

GROUP BY TblItems.ItemCode, TblItems.Description, TblItems.ItemClass, TblItems.ItemCategory;

寻求帮助以解决警告并获得我的预期输出。任何帮助是极大的赞赏。提前致谢。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    您不需要外部/第一组。由于您的项目表将[probably] 永远不会有重复的项目,因此返回的记录将始终是唯一的。

    您使用的两个左连接都是按itemCode 分组的,因此它们也只会为每个项目返回一条记录。所以不需要整体分组。

    这可能对你有用:

        SELECT 
        tblItems.ItemCode, 
        TblItems.Description, 
        TblItems.ItemClass, 
        TblItems.ItemCategory, 
        TblPurchaseAgg.pQuantity, 
        TblSalesAggs.sQuantity,
        (TblPurchaseAgg.pQuantity - TblSalesAggs.sQuantity) as stock,
        TblItems.unit
    FROM 
        (TblItems 
        LEFT JOIN 
            (
                SELECT 
                    TblPurchase.ItemCode AS ItemCode, 
                    Sum(TblPurchase.Quantity) AS pQuantity 
                FROM
                    TblPurchase
                GROUP BY TblPurchase.ItemCode
            )  AS TblPurchaseAgg
        ON TblItems.ItemCode = TblPurchaseAgg.ItemCode) 
        LEFT JOIN 
        (
            SELECT 
                tblSales.ItemCode AS ItemCode, 
                Sum(tblSales.Quantity) AS sQuantity 
            FROM 
                tblSales
            GROUP BY tblSales.ItemCode
        )  AS TblSalesAggs 
        ON TblItems.ItemCode = TblSalesAggs.ItemCode
    

    【讨论】:

    • 我的想法和你一模一样,但想不通。您在TblSalesAggs.sQuantity (TblPurchaseAgg.pQuantity - TblSalesAggs.sQuantity) as stock 处遗漏了一个逗号 (,)。我已经成功了。最后它奏效了。感谢您的努力。
    【解决方案2】:

    你能用这个吗-

    SELECT 
    tblItems.ItemCode, TblItems.Description, TblItems.ItemClass, TblItems.ItemCategory, TblPurchaseAgg.[pQuantity], TblSalesAggs.[sQuantity]
    FROM TblItems 
    
    LEFT JOIN (SELECT TblPurchase.ItemCode AS ItemCode, Sum(TblPurchase.Quantity) AS pQuantity FROM TblPurchase GROUP BY TblPurchase.ItemCode)  TblPurchaseAgg ON TblItems.ItemCode = TblPurchaseAgg.ItemCode
    LEFT JOIN (SELECT tblSales.ItemCode AS ItemCode, Sum(tblSales.Quantity) AS sQuantity FROM tblSales GROUP BY tblSales.ItemCode) TblSalesAggs ON TblItems.ItemCode = TblSalesAggs.ItemCode
    
    GROUP BY TblItems.ItemCode, TblItems.Description, TblItems.ItemClass, TblItems.ItemCategory;
    

    【讨论】:

    • 嗨,我已经尝试过您的回答,但它给了我Syntax error (missing operator) in query expression 'TblItems.ItemCode=TblPurchaseAgg.ItemCode Left Join .... 警告消息。我试图对查询进行故障排除,但没有运气。你能再检查一下吗?
    • 我更新了 SQL。我删除了所有的 cmets。你能再试一次吗?
    • 我已经尝试删除 cmets 但同样的警告。我也试过你编辑的代码,但同样的警告。 Can you please check file from this google drive link.
    • 问题在于 sql 结构和 DISTINCT。当您使用 group by 时,您不应该使用 distinct,它是自动不同的。无论如何,在 SQL 上花费几分钟。最新的 SQL 在我的 GoogleDrive 中运行。
    • 我的运气不好。这里仍然有同样的警告。能否请您给我下载正在运行的文件的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多