将 SUM 与左连接一起使用会得到错误的结果

ebe*_*beg 5 sql sql-server aggregate-functions

所以我有 :

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');
Run Code Online (Sandbox Code Playgroud)

我运行这个查询:

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
Run Code Online (Sandbox Code Playgroud)

我得到:

min(A.id)   SUM(A.amount)   COUNT(B.id)
1           75              3
3           10              0
Run Code Online (Sandbox Code Playgroud)

但我反而期望得到:

min(A.id)   SUM(A.amount)   COUNT(B.id)
1           50              3
3           10              0
Run Code Online (Sandbox Code Playgroud)

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

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

编辑以添加更多详细信息:我知道如果我删除分组依据,结果是正确的,我们可以看到 1, 50, 2 2, 25, 1

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

use*_*983 0

这样做的一种方法是使用ROW_NUMBER()

WITH CTE AS (SELECT A.id AS Aid,
            A.[type],
            A.amount,
            B.id AS bid,
            txt,
            ROW_NUMBER() OVER (PARTITION BY A.id ORDER BY B.id) AS RN
     FROM A
          LEFT JOIN B ON A.id = B.A_ID)
SELECT MIN(Aid) AS Min_A_ID,
       SUM(CASE RN WHEN 1 THEN amount END) AS Amount,
       COUNT(bid) AS BCount
FROM CTE
GROUP BY [type];
Run Code Online (Sandbox Code Playgroud)

我还建议摆脱该text数据类型并使用varchar(MAX).