2012-06-22 34 views
1

我的查詢有問題。無效使用組函數SUM()在哪裏

我想在我的WHERE中使用SUM,但它一直給我使用組函數無效。

AND SUM((invoices_out.net+invoices_out.vat)/currencies.rateVsPound) 
> 
(SELECT SUM(jobs_payments_accounts.amount/currencies.rateVsPound) 
FROM jobs_payments_accounts, jobs, enquiries, currencies 
WHERE jobs_payments_accounts.jobRef = jobs.id 
AND jobs_payments_accounts.currencyRef = currencies.id 
AND enquiries.id = jobs.enquiryRef 
AND enquiries.entityRef = ed.id) 

右側的>完美的工作,但我怎麼能實現我想要做的左側?

以下是完整的子查詢:

IF(ed.paymentTermsRef = 3, 
(SELECT SUM((invoices_out.net+invoices_out.vat)/currencies.rateVsPound) 
FROM enquiries, jobs, (SELECT * FROM invoices_out_reference GROUP BY invoiceRef) AS iorUnique, 
           (SELECT enquiryRef, sellingCurrency FROM parts_trading GROUP BY enquiryRef) AS PTU, 
           currencies, 
           invoices_out 
            WHERE enquiries.entityRef = ed.id 
            AND enquiries.id = jobs.enquiryRef 
            AND PTU.enquiryRef = enquiries.id 
            AND PTU.sellingCurrency = currencies.id 
            AND jobs.id = iorUnique.jobRef 
            AND iorUnique.invoiceRef = invoices_out.id 
            AND invoices_out.paid = 0 
           AND SUM((invoices_out.net+invoices_out.vat)/currencies.rateVsPound) 
            > 
            (SELECT SUM(jobs_payments_accounts.amount/currencies.rateVsPound) 
             FROM jobs_payments_accounts, jobs, enquiries, currencies 
             WHERE jobs_payments_accounts.jobRef = jobs.id 
             AND jobs_payments_accounts.currencyRef = currencies.id 
             AND enquiries.id = jobs.enquiryRef 
             AND enquiries.entityRef = ed.id) 
           #AND jobs.id NOT IN 
           #  (SELECT jobRef FROM jobs_payments_accounts) 
           # AND jobs.id NOT IN 
           #  (SELECT jobRef FROM jobs_payments_advance) 
           AND jobs.id IN 
            (SELECT jobRef FROM invoices_out_reference) 
           AND DATEDIFF(NOW(), invoices_out.date) >= 30), 
           NULL 
          ) 

嘗試實施你建議的NULL是什麼,但它使查詢慢。

還有很多麻煩,希望我能儘快破解它。

+1

在你的選擇,如果你做「SELECT SUM(jobs_payments_accounts.amount/monetary.rateVsPound)myval」你不能做的地方myval> ...(未經測試) – BugFinder

回答

10

的 「集合函數用戶俱樂部」 的第一條規則是:

你不使用WHERE

聚合函數

「聚合功能用戶俱樂部」的第二條規則是:

你不使用WHERE

HAVING子句在這種情況下要使用的聚合函數:這裏是a great topic學習它的一些複雜性。

我真的建議重構您的查詢(爲什麼使用嵌套子查詢在三個不同的表中檢查jobs.id而不是LEFT JOIN ... ON id IS NULL,例如?),或者將其用臨時表分成更小的表。沒有冒犯,但是當你看到你所引用的內容時,我實際上可以聽到你的數據庫哭泣。

6

必須使用HAVING與聚合函數:

select ... 
from ... 
where ... 
group by ... 
having sum(...) > ...