SQL JOIN 后按 DISTINCT 列求和值

SQL SUM values by DISTINCT column after JOIN

我已经在论坛上搜索了几个小时的解决方案,但我找不到适合我的问题的解决方案。

我有两个表:

members
****************
id   name    city
1    John    Boston
2    Maria   Boston
3    Steve   London
4    Oscar   London
5    Ben     Singapore

donations
********************
member_id    amount
1            100
1            150 
2            300 
3            50
3            100
3            50
4            75
5            200

我正在尝试创建一个按城市分类的汇总列表。所以我应该得到每个成员的捐款总和,然后按每个城市求和。

所以我的最终结果应该是这样的:

Result
*************
Boston    550
London    275
Singapore 200

这是我查询的最新版本:

SELECT me.id, me.city, don.mySUM
   FROM members me
LEFT JOIN (SELECT member_id, SUM(amount) AS mySUM 
   FROM donations GROUP BY member_id) don 
ON don.member_id=me.id GROUP BY me.city ORDER BY mySUM DESC

但它显然遗漏了一些东西,因为它汇总了城市但只添加了一个用户捐款的总和。

谁能告诉我正确的方向?

这是joingroup by。你把事情搞得太复杂了:

SELECT m.city, SUM(d.amount) as total_donations
FROM members me LEFT JOIN
     donations d
     ON d.member_id = m.id
GROUP BY m.city
ORDER BY total_donations DESC;

以下是您将如何实施 join。假设您的 left join 是故意的,在对数字数量求和时,我通常使用 coalescenulls 显示 0,但出于您的目的考虑它是可选的。

select a.city, sum(coalesce(b.amount,0)) as total_amount
from members a 
left join donations b on a.member_id=b.id
group by a.city
order by total_amount desc;

如果没有城市的捐赠信息,那么捐赠栏将显示为空。要将其转换为 0,您可以使用 coalesce(SUM(d.amount),0).

架构和插入语句:

create table members(id int,   name varchar(50),    city varchar(50));
insert into members values(1,    'John'    ,'Boston');
insert into members values(2,    'Maria'   ,'Boston');
insert into members values(3,    'Steve'   ,'London');
insert into members values(4,    'Oscar'   ,'London');
insert into members values(5,    'Ben'     ,'Singapore');

create table donations(member_id int,    amount int);
insert into donations values(1,            100);
insert into donations values(1,            150); 
insert into donations values(2,            300 );
insert into donations values(3,            50);
insert into donations values(3,            100);
insert into donations values(3,            50);
insert into donations values(4,            75);
insert into donations values(5,            200);

查询:

SELECT m.city, SUM(d.amount) as donations
FROM members m LEFT JOIN
     donations d
     ON d.member_id = m.id
GROUP BY m.city
ORDER BY city;

输出:

city total_donations
Boston 550
London 275
Singapore 200

db<>fiddle here