2012-06-22 3 views
1

У меня возникла проблема с моим запросом.Недопустимое использование групповой функции SUM() в WHERE

Я хочу использовать СУММ в своем ГДЕ, но он продолжает давать мне неправильное использование групповой функции.

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 
          ) 

Пробовал реализации, что вы предложили с IS NULL, но он делает запрос много медленнее.

Все еще есть много проблем с этим, надеюсь, я как-то взломаю его.

+1

В вашем выборе, если вы сделали «SELECT SUM (jobs_payments_accounts.amount/currencies.rateVsPound) как myval« вы не можете делать, где myval> ... (untested) – 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(...) > ... 
Смежные вопросы