sql - 将 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
解决方案
只是解决方案的较短版本。它首先在内部查询中计算 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
推荐阅读
- javascript - 很多时候 cypress 无法访问 /auth 页面并且找不到 id 或 class
- android - 如何为recyclerview中动态添加的项目设置OnclickListener?
- laravel - 在 Laravel 中重定向到 /folder/{param1}/{param2}
- php - PHP将多维数组的数组键附加到一维数组
- reactjs - ReactJS 中的“任务状态”框 - 找不到合适的设计组件
- javascript - 为什么 @Input() 更新数据 Angular 8 时不会触发 ngOnChanges()?
- react-native - TouchableOpacity onpress 不适用于导航
- reactjs - React - 使用 useRef 触发表单提交
- browser - 是否可以将 wasm 二进制文件捆绑到 JavaScript 包中以避免第二次请求?
- javascript - 如何使 d-flex 项目在反应中可滚动和可聚焦?