2017-02-14 114 views
3

我想創建一個查詢,在需要SUM函數和一個組的子查詢中進行計算。我的查詢返回錯誤「子查詢返回多於一行」。本質上,我試圖爲每個訂單返回「到期」金額。如果訂單總額大於付款表中total_collected(對於該order_id)的總和,則會有應付金額。以下是查詢:Mysql子選擇SUM()和組

SELECT o.order_id 
    , o.server 
    , o.subtotal 
    , o.discount 
    , o.tax, o.total 
    , (SELECT (o.total - SUM(p.total_collected)) 
      from orders o 
      join payments p 
       on o.order_id = p.order_id 
     group by p.order_id) as 'Due' 
    FROM orders o 
    join payments p 
    on o.order_id = p.order_id 
WHERE...; 

我不能在子選擇中包含'p.order_id',因爲它應該只包含一列。我明白爲什麼我得到錯誤,我只是不知道如何讓sub select只按每個order_id執行SUM。

+0

你可以包括你的期望的輸出? –

+0

請參閱http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-查詢 – Strawberry

回答

2

在不改變結構的情況下,我認爲子查詢正在查看訂單/付款表中的所有數據。我認爲你需要將其過濾爲只查看相關的order_id。

(我還添加了SUM周圍的訂單總額,因爲我敢肯定,將給予不同的錯誤沒有它。)

SELECT o.order_id 
    , o.server 
    , o.subtotal 
    , o.discount 
    , o.tax 
    , o.total 
    , (SELECT (SUM(o2.total) - SUM(p.total_collected)) 
      from orders o2 
      JOIN payments p 
       ON o2.order_id = p.order_id 
      WHERE o2.order_id = o.order_id) as 'Due' 
    FROM orders o 
WHERE...; 

儘管如此,如果你調整這一點,以便它使用一個連接,而不是一個子查詢,我想你會獲得更好的表現。事情是這樣的:

SELECT o.order_id 
    , o.server 
    , o.subtotal 
    , o.discount 
    , o.tax 
    , o.total 
    , o.total - c.Collected AS 'Due' 
    FROM orders o 
    JOIN (
     SELECT p2.order_id, SUM(p2.total_collected) AS 'Collected' 
      FROM payments p2 
     GROUP BY p2.order_id) AS c 
     ON o.order_id = c.order_id 
WHERE...; 
+1

在子查詢中不需要加入。 –

+0

在第二個例子的JOIN中使用子選擇效果很好!謝謝大衛! – Jdub

1

你不需要子查詢:

SELECT 
    o.order_id, 
    o.server, 
    o.subtotal, 
    o.discount, 
    o.tax, 
    o.total, 
    o.total - ifnull(sum(p.total_collected),0) As Due 
FROM orders AS o 
LEFT JOIN payments AS p ON o.order_id = p.order_id 
WHERE ... 
GROUP BY o.order_id