微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何查找捐助者姓名和他们一年的捐款总额,包括 ID 为 NULL 的匿名捐助者

如何解决如何查找捐助者姓名和他们一年的捐款总额,包括 ID 为 NULL 的匿名捐助者

我有一个需要解决sql 查询。 问题如下

一家福利组织多年来一直在接受捐助者的捐款。数据存储在下表中:

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 为空)。

编写一个返回的查询

  1. 恩人姓名。
  2. 他们在 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

解决方法

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;

Demo.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。