在WHERE中无效使用组函数SUM()

imp*_*335 1 mysql sum subquery where

我的查询有问题.

我想在我的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)
Run Code Online (Sandbox Code Playgroud)

>的右侧工作完美,但我怎样才能达到我想要做的左侧?

这是完整的子查询:

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
                             )
Run Code Online (Sandbox Code Playgroud)

尝试使用IS NULL实现您的建议,但它使查询慢.

仍然有很多麻烦,希望我会很快崩溃它.

rai*_*7ow 10

"聚合功能用户俱乐部"的第一条规则是:

您不在WHERE中使用聚合函数

"聚合功能用户俱乐部"的第二条规则是:

您不在WHERE中使用聚合函数

HAVING在这种情况下必须使用条款:这是研究它的一些复杂性的一个很好的主题.

我真的建议重构你的查询(为什么使用嵌套的子查询来检查jobs.id三个不同的表而不是LEFT JOIN ... ON id IS NULL,例如?)或者用临时表将它分成更小的表.没有冒犯,但是当看到你引用的内容时,我实际上可以听到你的数据库哭声.


Boh*_*ian 6

您必须使用HAVING聚合函数:

select ...
from ...
where ...
group by ...
having sum(...) > ...
Run Code Online (Sandbox Code Playgroud)