2010-11-03 57 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語法。