我正在研究这个SQL问题:
显示任何收费金额和实际金额不同的采购订单。通过显示采购订单编号,每个采购订单的POAmount,实际金额(通过添加订单中所有项目的价格计算)以及两者之间的差异来显示此信息。对结果进行排序,以便首先显示差异最大的那些。
我在运行下面的sql语句时得到以下代码:
错误代码-1,SQL状态42903:聚合函数的使用无效。
select
purchaseorder.ponum,
purchaseorder.amount,
sum(poitems.quantity*poitems.unitprice),
purchaseorder.amount-sum(poitems.quantity*poitems.unitprice)
from purchaseorder, poitems
where
purchaseorder.ponum = poitems.ponum
and purchaseorder.amount!=sum(poitems.quantity*poitems.unitprice)
group by
purchaseorder.ponum,
purchaseorder.amount
我认为这是因为我在where子句中使用了聚合函数。
如何解决这个问题?
谢谢,
答案 0 :(得分:5)
试试这个:
select
purchaseorder.ponum,
purchaseorder.amount,
sum(poitems.quantity*poitems.unitprice),
purchaseorder.amount-sum(poitems.quantity*poitems.unitprice)
from purchaseorder, poitems
where
purchaseorder.ponum = poitems.ponum
group by
purchaseorder.ponum,
purchaseorder.amount
having
purchaseorder.amount!=sum(poitems.quantity*poitems.unitprice)
答案 1 :(得分:3)
您不能在where
子句中使用聚合 - 这是having
的用途 - 更改为
select purchaseorder.ponum,
purchaseorder.amount,
sum(poitems.quantity*poitems.unitprice) as actual,
purchaseorder.amount - sum(poitems.quantity*poitems.unitprice) as diff
from purchaseorder,
poitems
where purchaseorder.ponum = poitems.ponum
group by purchaseorder.ponum,
purchaseorder.diff
having diff != 0
order by ABS(diff) desc
答案 2 :(得分:1)
看起来您应该使用HAVING
子句:
SELECT ...
FROM purchaseorder
JOIN poitems ON (purchaseorder.ponum = poitems.ponum)
GROUP BY purchaseorder.ponum, purchaseorder.amount
HAVING purchaseorder.amount != sum(poitems.quantity * poitems.unitprice);
HAVING
子句几乎应用于最后,主要用于过滤聚合函数。在LIMIT
之后应用HAVING
。
请注意,SQL标准要求HAVING
必须仅引用GROUP BY
子句中的列或聚合函数中使用的列。但是,MySQL支持对此行为的扩展,并允许HAVING
引用SELECT
列表中的列以及外部子查询中的列。
作为旁注,您可能还希望在那里使用显式的内部联接(如我的示例所示),而不是您正在使用的旧ANSI-89语法。
答案 3 :(得分:0)
这对我有用。谢谢你们!
select purchaseorder.ponum,
purchaseorder.amount,
sum(poitems.quantity*poitems.unitprice) as actual,
purchaseorder.amount - sum(poitems.quantity*poitems.unitprice) as "diff"
FROM purchaseorder
JOIN poitems ON (purchaseorder.ponum = poitems.ponum)
GROUP BY purchaseorder.ponum, purchaseorder.amount
HAVING purchaseorder.amount != sum(poitems.quantity * poitems.unitprice)
order by "diff" desc