2017-11-05 6 views
1

私のSQLの問題を解決するために助けてください。 は私のDBで、私は enter image description hereは、SQLのユニオン3テーブルに参加する

を以下のように3つのテーブルを持っている私は、特定のための請求合計返金と合計を表示し、この方法は、(現金、クレジットカードまたはチェックアウト)を払い戻すか、または請求書に使用されているクエリを書いています注文。

私のクエリは次の通りです:

SELECT Method, SUM(total_invoiced), SUM(total_refunded) 
FROM 

(SELECT refunds.method_rf AS Method, 0 AS total_invoiced, 
    SUM(refunds.ref_value) AS total_refunded 
FROM refunds LEFT JOIN orders ON(refunds.order_id = orders.entity_id) 
WHERE (orders.entity_id = 3) 
GROUP BY Method 
union 
SELECT invoices.method_in as Method, SUM(invoices.inv_value) AS 
total_invoiced, 0 AS total_refunded 
FROM invoices left JOIN orders ON(invoices.order_id = orders.entity_id) 
WHERE (orders.entity_id = 3) 
GROUP BY Method)main_table 
GROUP BY Method 

出力は、私が期待したものです。ここでは、

output

である私の質問は: がインオーダーである私の繰り返し条件を削除するには、私のクエリを書き直すとにかくがある場合(orders.entity_id = 3)と、クエリは次のようになります。

SELECT Method, SUM(total_invoiced), SUM(total_refunded) 
FROM 

(SELECT refunds.method_rf AS Method, 0 AS total_invoiced, 
    SUM(refunds.ref_value) AS total_refunded 
FROM refunds LEFT JOIN orders ON(refunds.order_id = orders.entity_id) 
GROUP BY Method 
union 
SELECT invoices.method_in as Method, SUM(invoices.inv_value) AS 
total_invoiced, 0 AS total_refunded 
FROM invoices left JOIN orders ON(invoices.order_id = orders.entity_id) 
GROUP BY Method)main_table 
"PUT YOUR CONDITION" 
GROUP BY Method 
+0

互換性のないデータベースタグを削除しました。実際に使用しているデータベースのみにタグを付けてください。 –

+0

各クエリにentityidを追加して、それをグループ化するだけです。外側の選択は、それによってフィルタリングすることができます。これは遅くなります – xQbert

答えて

1

union allを使用してください。 unionは、重複を削除するオーバーヘッドが発生します。次は少し簡単です - あなたはordersテーブルは必要ありません。

SELECT Method, SUM(total_invoiced), SUM(total_refunded) 
FROM ((SELECT r.method_rf AS Method, 0 AS total_invoiced, SUM(r.ref_value) AS total_refunded 
     FROM refunds r 
     WHERE r.order_id = 3 
     GROUP BY i.Method 
    ) UNION ALL 
     (SELECT i.method_in as Method, SUM(i.inv_value) AS total_invoiced, 0 AS total_refunded 
     FROM invoices i 
     WHERE i.order_id = 3 
     GROUP BY i.Method 
    ) 
    ) ir 
GROUP BY Method; 

私はパフォーマンス上の理由から、各サブクエリでフィルタを残すでしょう。 1つの注文のみを気にしている場合は、集計する前にフィルタリングを行うとパフォーマンスが向上します。

+0

あなたの応答のためにゴードンLinoffありがとうございます。 実際には、この特定のタスクのパフォーマンスについては気にしません。 サブクエリの外側で条件をどこに移動する必要がありますか。 そして、選択のための基本条件があるので注文テーブルが必要です(注文entity_id) –

+0

@ZainDeeb。 。 。 'JOIN'ロジックによれば、' entity_id'は他の2つのテーブルの 'order_id'と同じです。 –

+0

はい、それは..... –

関連する問題