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
但它显然遗漏了一些东西,因为它汇总了城市但只添加了一个用户捐款的总和。
谁能告诉我正确的方向?
这是join
和group 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
是故意的,在对数字数量求和时,我通常使用 coalesce
为 nulls
显示 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
我已经在论坛上搜索了几个小时的解决方案,但我找不到适合我的问题的解决方案。
我有两个表:
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
但它显然遗漏了一些东西,因为它汇总了城市但只添加了一个用户捐款的总和。
谁能告诉我正确的方向?
这是join
和group 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
是故意的,在对数字数量求和时,我通常使用 coalesce
为 nulls
显示 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