where子句中聚合函数的SQL问题

where子句中聚合函数的SQL问题,sql,db2,aggregate-functions,Sql,Db2,Aggregate Functions,我正在处理这个SQL问题: 显示任何收费金额与实际金额不同的采购订单。通过显示采购订单编号、每个采购订单的采购订单金额、实际金额(通过添加订单中所有项目的价格计算)以及两者之间的差异来显示。对结果进行排序,首先显示差异最大的结果 运行下面的sql语句时,我得到以下代码: 错误代码-1,SQL状态42903:聚合函数的使用无效 select purchaseorder.ponum, purchaseorder.amount, sum(poitems.quantity*poitem

我正在处理这个SQL问题:

显示任何收费金额与实际金额不同的采购订单。通过显示采购订单编号、每个采购订单的采购订单金额、实际金额(通过添加订单中所有项目的价格计算)以及两者之间的差异来显示。对结果进行排序,首先显示差异最大的结果

运行下面的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子句中使用了聚合函数

我怎样才能解决这个问题

谢谢,

试试这个:

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风格