我的查询有问题。
我想在我的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
)
尝试使用IS NULL实现您的建议,但它使查询多更慢。
对此仍然有很多麻烦,希望我能以某种方式很快破解它。
答案 0 :(得分:10)
“聚合功能用户俱乐部”的第一条规则是:
您不在WHERE
中使用聚合函数
“聚合功能用户俱乐部”的第二条规则是:
在这种情况下必须使用您不在WHERE
中使用聚合函数
HAVING
子句:这里a great topic来研究它的一些复杂性。
我真的建议重构你的查询(为什么使用嵌套子查询在三个不同的表中检查jobs.id
而不是LEFT JOIN ... ON id IS NULL
,例如?)或者用临时表将它分成较小的子表。没有冒犯,但在查看你引用的内容时,我实际上可以听到你的数据库哭声。
答案 1 :(得分:6)
您必须将HAVING
与聚合函数一起使用:
select ...
from ...
where ...
group by ...
having sum(...) > ...