3

クエリに問題があります。

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で提案したものを実装しようとしましたが、クエリが非常に遅くなります。

まだこれで多くの問題を抱えています、うまくいけば、私は何とかしてすぐにそれをクラックするでしょう。

4

2 に答える 2

13

「集計関数ユーザークラブ」の最初のルールは次のとおりです。

WHEREでは集計関数を使用しません

「集計関数ユーザークラブ」の2番目のルールは次のとおりです。

WHEREでは集計関数を使用しません

HAVINGこのような場合は、句を使用する必要があります。これは、その複雑さを研究するための優れたトピックです。

そして、クエリを再構築するか(たとえば、ネストされたサブクエリを使用して、たとえば、jobs.id代わりに3つの異なるテーブルをチェックインするのはなぜLEFT JOIN ... ON id IS NULLですか?)、一時テーブルを使用してクエリをより小さなテーブルに分割することをお勧めします。不快感はありませんが、あなたが引用したものを見ると、実際にあなたのDBの叫び声が聞こえます。

于 2012-06-22T11:16:27.430 に答える
8

HAVING集計関数で使用する必要があります。

select ...
from ...
where ...
group by ...
having sum(...) > ...
于 2012-06-22T11:11:56.643 に答える