2017-02-14 23 views
3

SUM関数とグループを必要とするサブクエリで計算を行うクエリを作成しようとしています。私のクエリは、 "Subqueryが1行以上を返す"というエラーを返します。基本的に私は、各注文の金額を「延期」に戻そうとしています。受注合計が支払テーブルのtotal_collected(そのorder_idの場合)の合計よりも大きい場合、支払額が支払われます。ここでは、クエリは次のとおりです。SUM()とグループを持つMysqlサブ選択

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...; 

それは1列のみが含まれている必要があるので、私は選択のサブで「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

2番目の例の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 
関連する問題