where子句中聚合函数的SQL问题
我正在处理这个SQL问题: 显示任何收费金额与实际金额不同的采购订单。通过显示采购订单编号、每个采购订单的采购订单金额、实际金额(通过添加订单中所有项目的价格计算)以及两者之间的差异来显示。对结果进行排序,首先显示差异最大的结果 运行下面的sql语句时,我得到以下代码: 错误代码-1,SQL状态42903:聚合函数的使用无效where子句中聚合函数的SQL问题,sql,db2,aggregate-functions,Sql,Db2,Aggregate Functions,我正在处理这个SQL问题: 显示任何收费金额与实际金额不同的采购订单。通过显示采购订单编号、每个采购订单的采购订单金额、实际金额(通过添加订单中所有项目的价格计算)以及两者之间的差异来显示。对结果进行排序,首先显示差异最大的结果 运行下面的sql语句时,我得到以下代码: 错误代码-1,SQL状态42903:聚合函数的使用无效 select purchaseorder.ponum, purchaseorder.amount, sum(poitems.quantity*poitem
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子句中使用了聚合函数
我怎样才能解决这个问题
谢谢,试试这个:
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)
在
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
看起来您应该使用
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
子句几乎是最后应用的,主要用于对聚合函数进行过滤<代码>限制在具有
后应用
请注意,SQL标准要求have
必须仅引用GROUP BY
子句中的列或聚合函数中使用的列。但是,MySQL支持对该行为的扩展,并允许have
引用SELECT
列表中的列以及外部子查询中的列
作为补充说明,您可能还希望在其中使用显式内部联接(如我的示例所示),而不是您正在使用的旧ANSI-89语法。以下是对我有效的方法。谢谢大家
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
这不符合他要求的顺序——首先是最高差异;)谢谢你帮我订购。但是,在使用您的代码时,我遇到了此错误:错误代码-1,SQL状态42X04:列“DIFF”不在FROM列表中的任何表中,或者出现在联接规范中,并且不在联接规范的范围内,或者出现在HAVING子句中,并且不在GROUP BY列表中。如果这是CREATE或ALTER TABLE语句,则“DIFF”不是目标表中的一列。请查看编辑是否有效(我刚刚执行了错误指示的操作,仍然未测试:P)是否
金额始终大于实际值?否则,您可能需要orderbyabs(diff)
或类似的东西,具体取决于您的SQL风格