我的左联接查询不包括作为聚合函数一部分的指定表达式



我正在尝试列出商店中每个产品的PID、ProdName、Price、CateType和当前库存数量余额。要做到这一点,我需要从MicrosoftAccess文件中另一个表的合计数量中减去数量。

我的代码如下:

SELECT pi.PID, ProdName, Price, CateType, pi.Qty - SUM(ol.Qty) AS [Qty Balance]
From Product_Info pi Left Join OrderLine ol
ON pi.PID = ol.PID;

当我尝试运行此代码时,它会出现一个错误代码,上面写着"您的查询不包括作为聚合函数"PID"的一部分的指定表达式"PID";

我已经读到,我需要使用group-by来解决这个问题,但是,如果我使用group-bey,它只会在select语句中的值列表中出现,并且不会解决任何问题。

如果有人能帮我解决这个问题,我将不胜感激:(

您有一个聚合查询,但没有group by。在没有示例数据、所需结果和查询解释的情况下,建议的唯一解决方案是将未聚合的列放在group by子句中:

SELECT pi.PID, ProdName, Price, CateType, pi.Qty - SUM(ol.Qty) AS [Qty Balance]
FROM Product_Info pi Left Join
OrderLine ol
ON pi.PID = ol.PID
GROUP BY pi.PID, ProdName, Price, CateType, pi.Qty;

您读到的是正确的,需要一个GROUP BY和一个聚合函数。基本的聚合函数似乎不是你想要的,尽管你的语句"如果我使用一个分组,它只会在我的select语句中的值列表中向下移动显示了为什么会这样。错误消息告诉您,除了SELECT列表中的聚合字段之外,任何其他字段都需要在GROUP BY中。但您看到的是,当您GROUP BY所有其他相关字段时,每个组只有一条记录(行(。因此,结果集看起来就像刚开始的一样,因为每个记录都是自己的组。

根据您的Access版本,您可能无法使用(pi.Qty - SUM(ol.QTY) OVER ()) AS [Qty Balance],但对于您的情况,更好的解决方案是使用PARTITION BY。如果您想找到每个产品的余额,并且PID也是订单行表中的一个字段,则可以使用(pi.Qty - (SELECT SUM(ol.QTY) OVER (PARTITION BY PID))) AS [Qty Balance]

最新更新