簡體   English   中英

從依賴於聯接表的子查詢中選擇一個求和值

[英]Selecting a summed value from a subquery that relies on a joined table

因此,我很幸運,能夠為我們的應用程序優化查詢,而該查詢對於我們獲取的數據來說花費的時間太長了。 我們正在尋找的數據不是很復雜,但是糟糕的數據庫設計使它變得比原本要困難得多(這很棒,因為我是大約一年前設計過的人)。

總體思路是,我們正在嘗試計算每個客戶的總銷售額(他們購買了可以增加其余額的商品)和總付款額(他們用他們的余額支付了款項)。

表格:

顧客

  • ID
  • 公司

銷售(發票)

  • ID
  • 顧客ID

付款(帳戶付款)

  • ID
  • 顧客ID
  • transaction_id(鏈接到invoice_transactions)

交易(invoice_transactions)

  • ID
  • invoice_id(鏈接到發票,如果付款,則為null)

如果用戶進行銷售 ,則該信息會記錄在invoicesinvoice_transactions ,其中invoice_transactions的發票記錄的invoice_id包含customer_id。

如果用戶付款 ,該信息將記錄在account_paymentsinvoice_transactions ,其中invoice_transaction的invoice_id為NULL,而account_payments包含transaction_id和customer_id。

我知道,這太可怕了……我還以為自己很聰明! 好吧,我解決了問題,並提出了一個不錯的解決方案:

SELECT SQL_NO_CACHE
    c.company,
    (SELECT SUM(amount) FROM sales),
    (SELECT SUM(amount) FROM payments)
FROM customers c
JOIN invoices i ON i.customer_id = c.id
JOIN invoice_transactions sales ON i.invoice_id = sales.id
JOIN account_payments ap ON ap.customer_id = c.id
JOIN invoice_transactions payments ON ap.transaction_id = payments.id

除了給我一個錯誤“#1146-表'db.sales'不存在”之外,該命令什么都不做。 我猜想這與聯接之前讀取子查詢有關,但是老實說我不知道​​。 不幸的是,我不知道解決這個問題的另一種方法。如果有人可以幫助我,我將不勝感激!

我認為最好的方法是將“銷售”和“付款”元素分成子查詢,您當前的方法是在進行匯總之前將所有付款與所有發票交叉連接。

SELECT  c.ID, 
        c.Company, 
        COALESCE(Sales.Amount, 0) AS Sales, 
        COALESCE(Payments.Amount, 0) AS Payments
FROM    Customers c
        LEFT JOIN
        (   SELECT  Customer_ID, SUM(Amount) AS Amount
            FROM    Invoices
                    INNER JOIN invoice_transactions
                        ON Invoice_ID = Invoices.ID
            GROUP BY Customer_ID
        ) As Sales
            ON Sales.Customer_ID = c.ID
        LEFT JOIN
        (   SELECT  Customer_ID, SUM(Amount) AS Amount
            FROM    Account_Payments 
                    INNER JOIN invoice_transactions tr
                        ON tr.ID = Transaction_ID
            GROUP BY Customer_ID
        ) AS Payments
            ON Payments.Customer_ID = c.ID;

這將包括沒有發票也沒有付款的客戶。 您可以將左聯接更改為內部聯接以進行操作。

SQL小提琴上的工作示例

您的查詢沒有任何意義。

完成所有聯接之后,為什么不只使用“ from”子句中的表:

SELECT c.company, SUM(sales.amount),  SUM(payments.amount)
FROM customers c JOIN invoices i ON i.customer_id = c.id JOIN
     invoice_transactions sales ON i.invoice_id = sales.id JOIN
     account_payments ap ON ap.customer_id = c.id JOIN
     invoice_transactions payments ON ap.transaction_id = payments.id
group by c.company

僅在“ from”子句中為表賦予別名,並不能使其在查詢中其他位置的子查詢中可用。

我還添加了GROUP BY子句,因為您的查詢似乎是按公司匯總的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM