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
这样做的一种方法是使用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).