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

时间:2010-11-03 23:52:22

标签: sql db2 aggregate-functions

我正在研究这个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子句中使用了聚合函数。

如何解决这个问题?

谢谢,

4 个答案:

答案 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
相关问题