2017-01-31 23 views
1

私は3つのテーブルを持っています。会員払い戻しおよび領収書。私は会員の名、領収書を持つ払い戻し合計を表示したい。例3番目のテーブルのカウントに基づいて2つのテーブルから選択してください

メンバー

member_id member_name 
1   luffy 
2   zoro 
3   nami 

償還

reimburse_id member_id reimburse_total 
1   1   5000 
2   2   10000 
3   3   10000 

レシート

receipt_id reimburse_id reimburse_price reimburse_no 
1   1   2500   2012232 
2   1   2500   2012123 
3   2   5000   2012454 
4   2   5000   2012565 

のために私は領収書を持っているメンバーのすべての償還を表示したいです。この場合、選択クエリは、これまでのところ、この私私は

SELECT member.member_name, 
     COU­NT(distinct reimbursement.reimbu­rse_id) as nor, 
     SUM(distinct reimbursement.reimbu­rse_total) 
FROM member INNER JOIN 
    reimbursement 
    ON member.member_id = reim­bursement.member_id INNER JOIN 
    receipt 
    ON reimbursement.reimbu­rse_id=receipt.reimb­urse_id 
GROUP BY member.memberID 

ましたが、私は間違った合計を得たものを、この

name No. of reimburse total 
luffy   1   5000 
zoro   1   10000 
nami   0   0 

のように返す必要があります。

答えて

1

Hmmm。これは、値が使用されるべきかどうかを判断するためにreceiptを使用しているだけなので、少し奇妙です。一つの方法は、LEFT JOINと、いくつかの条件付きロジックです:

SELECT m.member_name, 
     COUNT(rr.reimburse_id) as nor, 
     SUM(CASE WHEN rr.reimburse_id IS NOT NULL THEN reimburse_total ELSE 0 END) as reimbu­rse_total 
FROM member m LEFT JOIN 
    reimbursement r 
    ON m.member_id = r.member_id LEFT JOIN 
    (SELECT DISTINCT rr.reimburse_id 
     FROM receipt rr 
    ) rr 
    ON r.reimbu­rse_id = rr.reimb­urse_id 
GROUP BY m.memberID, m.member_name; 

このクエリの背後にある論理は、返済が利用可能かどうかを決定するためにのみreceiptテーブルを使用することです。 select distinctは重複を削除します。次に、left joincaseは、テーブルに一致するものがあるかどうかを判断します。

+0

ご迷惑をおかけします。私はあなたの答えを確認する必要があります – healer

+0

待ってくださいそれはうまく動作します。あなたは何をしたのか説明できますか?それは私が知っているものとはまったく異なっています – healer

+0

私はこの行を持っていませんどのようにクエリがすべての領収書記録をチェックするのですか? "rr.reimburse_id IS NOT NULL THEN reimburse_total ELSE 0 END" – healer

関連する問題