首页 > 解决方案 > 将 SUM 与左连接一起使用会得到错误的结果

问题描述

所以我有 :

CREATE TABLE A (id INT,type int,amount int);
INSERT INTO A (id,type,amount) VALUES (1,0,25);
INSERT INTO A (id,type,amount) VALUES (2,0,25);
INSERT INTO A (id,type,amount) VALUES (3,1,10);


CREATE TABLE B (id INT,A_ID int,txt text);
INSERT INTO B (id,A_id,txt) VALUES (1,1,'abc');
INSERT INTO B (id,A_id,txt) VALUES (2,1,'def');
INSERT INTO B (id,A_id,txt) VALUES (3,2,'xxx');

我运行这个查询:

SELECT min(A.id), SUM(A.amount), COUNT(B.id) FROM A
LEFT JOIN B ON A.id = B.A_id
GROUP BY A.type

我得到:

min(A.id)   SUM(A.amount)   COUNT(B.id)
1           75              3
3           10              0

但我反而期望得到:

min(A.id)   SUM(A.amount)   COUNT(B.id)
1           50              3
3           10              0

有人可以帮忙吗?实现这一确切结果的最佳方法是什么?我想要 group BY 类型并获取分组 A.amount 的 SUM 并获取与其外键对应的所有 B 的 count() 。

这是重现:https ://www.db-fiddle.com/f/esu13uGLcgFDpX7aEQRMJR/0请运行 sql 代码。

编辑添加更多细节:如果我删除 group by 我们可以看到1、50、2 2、25、1,我知道结果是正确的

但我期待上述结果,实现它的最佳方法是什么?我想对 TYPE 进行 SUM 然后计算与该分组 A 相关的所有 B

标签: sqlsql-serveraggregate-functions

解决方案


只是解决方案的较短版本。它首先在内部查询中计算 B_ID,因此我需要对外部查询中的计数求和。

SELECT  min(A.id), SUM(A.amount), Sum(Bid) FROM A
LEFT JOIN (select count(id) as Bid, A_id from B group by A_id) as Bcount  
ON A.id = Bcount.A_id
GROUP BY A.type

推荐阅读