2017-04-26 5 views
2

私のクエリは2つのサブテーブルから2つの列の不正確な合計を返します。私はGoogle上で検索し、stackoverflowで提案を見ました。複数の結合を使用すると誤った結果を返すMysql sumクエリ

si_invoices 
    ----------------------------- 
    id, date 
    1, 2014-05-07 


    si_invoice_items 
    ----------------------------- 
    id, invoice_id, date , total 
    1, 100, 2014-05-07, 200 
    2, 100, 2014-05-07, 200 

    si_payment 
    ----------------------------- 
    id, ac_inv_id, date , payment 
    1, 100, 2014-05-07, 100 
    2, 100, 2014-05-07, 200 

    SELECT SI.*,SUM(SII.total) as total,SUM(SIP.payment) as payment FROM 
     (SELECT * FROM si_invoices GROUP BY si_invoices.id) AS SI 
    LEFT JOIN si_invoice_items SII ON SII.invoice_id = SI.id 
    LEFT JOIN si_payment SIP ON SIP.ac_inv_id = SII.invoice_id 
    GROUP BY SI.id 

sqlの 'total'フィールドでは400合計を返しますが、 'payment'と同じ800を返します。私の質問でエラーが何であるかを教えてください。助けていただければ幸いです。

おかげ M.S

+0

は、私はすでに望ましい結果を説明したい期待される結果 –

+0

を示しました。その質問を行ってください。それは合計として400を返しますが、実際には800を返しています。 –

+0

1.SELECT * FROM si_invoices GROUP BY si_invoices.idは構文エラーを出す必要があります。 Group Byには列が1つしかなく、複数の列をフェッチしようとしています。 – Kapil

答えて

1

は直接の合計を使用しますおそらくあなたが望む組み合わせでさらに多くの行を作成するでしょう。

次のことを試してみてください。

SELECT id, MAX(Total) as FinalTotal ,MAX(Payment) as FinalPayment 
FROM si_invoices a 
    left join 
    (select invoice_id, sum(total) as Total from si_invoice_items group by invoice_id) b 
    on a.id = b.invoice_id 
    left join 
    (select ac_inv_id, sum(payment) as Payment from si_payment group by ac_inv_id) c 
    on c.ac_inv_id = a.id 
group by id 

やidが一意である場合:

SELECT * 
FROM si_invoices a 
    left join 
    (select invoice_id, sum(total) as Total from si_invoice_items group by invoice_id) b 
    on a.id = b.invoice_id 
    left join 
    (select ac_inv_id, sum(payment) as Payment from si_payment group by ac_inv_id) c 
    on c.ac_inv_id = a.id 
+0

答えをいただきありがとうございます.2番目のクエリは完全に機能しました。 –

0

詳細結果:

select a.invoice,ac_inv_id,sum(a.total),sum(b.payment) from 
(select 1 as id, 100 as invoice, '2014-05-07' as date, 200 as total union all 
select 2, 100, '2014-05-07', 200) as a 
left join 
(select 1 as id, 100 as ac_inv_id, '2014-05-07' as date, 100 as payment union all 
select 2, 100, 2014-05-07, 200) as b 
on a.id = b.id 

最終クエリ:

select a.invoice,ac_inv_id,sum(a.total),sum(b.payment) from 
(select * from si_invoice_items) as a 
left join 
(select * from si_payment) as b 
on a.id = b.id 

結果:あなたは、A加入するため

100 100 400 300 
関連する問題