我有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
我想显示有收据的会员的所有报销。在这种情况下,select查询应该像这样返回
name No. of reimburse total
luffy 1 5000
zoro 1 10000
nami 0 0
到目前为止,我得到了什么
SELECT member.member_name,
COUNT(distinct reimbursement.reimburse_id) as nor,
SUM(distinct reimbursement.reimburse_total)
FROM member INNER JOIN
reimbursement
ON member.member_id = reimbursement.member_id INNER JOIN
receipt
ON reimbursement.reimburse_id=receipt.reimburse_id
GROUP BY member.memberID
但是总得错了。
答案 0 :(得分: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 reimburse_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.reimburse_id = rr.reimburse_id
GROUP BY m.memberID, m.member_name;
此查询背后的逻辑是仅使用receipt
表来确定是否有可用的报销。 select distinct
删除重复项。然后left join
和case
确定表格是否匹配。