2010-11-03 63 views
5

我正在解决此SQL问题:集合函数SQL where问题

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

错误代码为-1,SQL状态42903:无效的使用集合函数

运行下面的SQL语句时,我得到了下面的代码。

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

这是我的工作。多谢你们!

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 
+0

是'amount'总是大于'actual'?否则你可能需要'按ABS(差异)排序'或类似的依赖于你的SQL风格 – tobyodavies 2010-11-04 04:04:12

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) 
+0

这不会做他要求的顺序 - 与最高差异第一;) – tobyodavies 2010-11-04 00:01:04

2

你不能在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 
+0

感谢您看到我需要它的顺序。在使用代码时出现此错误: – novicePrgrmr 2010-11-04 00:29:28

+0

错误代码-1,SQL状态42X04:列'DIFF'或者不在FROM列表中的任何表中,或者出现在联接规范中并且在联接范围之外规范或出现在HAVING子句中,但不在GROUP BY列表中。如果这是一个CREATE或ALTER TABLE语句,那么'DIFF'不是目标表中的一列。 – novicePrgrmr 2010-11-04 00:29:50

+0

看看编辑是否有效(我刚刚做了错误说要做的事情,仍未经测试:P) – tobyodavies 2010-11-04 01:16:26

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子句几乎适用于最后一个,主要用于对集合函数进行过滤。在HAVING之后应用LIMIT

请注意,SQL标准要求HAVING必须仅引用GROUP BY子句中的列或聚合函数中使用的列。但是,MySQL支持对此行为的扩展,并允许HAVING引用SELECT列表中的列以及外部子查询中的列。作为一个侧面说明,您可能还想在其中使用明确的Inner Join(如我的示例中所示),而不是您正在使用的旧ANSI-89语法。