2017-01-31 2 views
1

У меня есть 3 стола. член возмещения и получения. Я хочу отобразить имя участника, сумму возмещения, которая имеет квитанцию. Напримервыбрать из 2-х столов на основе подсчета 3-го стола

член

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 

Я хочу, чтобы отобразить все компенсации элемента, который имеет квитанцию. В этом случае выберите запрос должен возвращать как этот

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

До сих пор это я, что я получил

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 

, но я получил неправильную сумму.

ответ

1

Хммм. Это немного странно, потому что вы используете только 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 join и case определяют соответствие матчей таблице.

+0

извините за поздний отклик. Я должен проверить ваш ответ, пожалуйста, подождите – healer

+0

Сэр отлично работает. Можете ли вы объяснить, что вы сделали? Это полностью отличается от того, что я знаю – healer

+0

sir Я не получаю эту строку, как запрос будет проверять каждую запись квитанции? «CASE WHEN rr.reimburse_id НЕ НУЛЛ, а затем reimburse_total ELSE 0 END» – healer