如何解决如何查找捐助者姓名和他们一年的捐款总额,包括 ID 为 NULL 的匿名捐助者
一家福利组织多年来一直在接受捐助者的捐款。数据存储在下表中:
CREATE TABLE benefactors (
id INTEGER PRIMARY KEY,name VARCHAR(50) NOT NULL
);
CREATE TABLE donations (
id INTEGER PRIMARY KEY,amount INTEGER NOT NULL,year INTEGER NOT NULL,benefactorId INTEGER REFERENCES benefactors(id)
);
INSERT INTO benefactors(id,name) VALUES(1,'Phil');
INSERT INTO benefactors(id,name) VALUES(2,'Nicholas');
INSERT INTO benefactors(id,name) VALUES(3,'William');
INSERT INTO donations(id,amount,year,benefactorId) VALUES(1,2000,2014,1);
INSERT INTO donations(id,benefactorId) VALUES(2,2800,2015,benefactorId) VALUES(3,900,benefactorId) VALUES(4,1200,2);
INSERT INTO donations(id,benefactorId) VALUES(5,3200,null);
INSERT INTO donations(id,benefactorId) VALUES(6,4000,benefactorId) VALUES(7,2400,2016,2);
一些捐赠来自匿名来源(benefactorId 为空)。
- 恩人姓名。
- 他们在 2015 年的贡献总和。
在 2015 年未能做出贡献的捐助者也应以其贡献为 0 返回。所有匿名贡献应以“匿名”的名义汇总。如果 2015 年没有匿名贡献,则不应返回名称为“匿名”的行。
我尝试过使用左连接,但无法理解如何使用 Union 和 Case 语句来解决问题。我需要匿名贡献者和 2015 年捐赠 0 次的人的姓名。
这是我试过的。
SELECT IFNULL(b.name,'Anonymous') AS Name,IFNULL(SUM(d.amount),0) AS 'Amount'
FROM benefactors b
LEFT JOIN donations d
ON b.id = d.benefactorId
WHERE d.year = 2015
GROUP BY b.id
我只得到这些作为结果
姓名 | 金额 |
---|---|
菲尔 | 3700 |
尼古拉斯 | 1200 |
而正确的结果是
姓名 | 金额 |
---|---|
菲尔 | 3700 |
尼古拉斯 | 1200 |
匿名 | 7200 |
威廉 | 0 |
解决方法
- 以下是模拟全外连接的方法。
- DB 小提琴链接 -> https://www.db-fiddle.com/f/oMSGnCvsQPasG3cjRaTnxr/4
select b.name as Name,sum(coalesce(d.amount,0)) as Amount
from benefactors b
left join donations d
on b.id = d.benefactorId
where d.year = 2015 or d.year is null
group by b.id
union
select'Anonymous' as Name,sum(amount) as Amount
from donations
where benefactorId is null;
,
而不是 3 次查询,您只需 2 次查询即可获得所需的结果 -
SELECT IFNULL(b.name,'Anonymous') AS Name,IFNULL(SUM(d.amount),0) AS 'Amount'
FROM benefactors b
LEFT JOIN donations d
ON b.id = d.benefactorId
AND d.year = 2015
GROUP BY b.id
UNION
SELECT IFNULL(b.name,0) AS 'Amount'
FROM benefactors b
RIGHT JOIN donations d
ON b.id = d.benefactorId
WHERE d.year = 2015
GROUP BY b.id;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。