Sql 从按某个id分组的多行总和中查找最小值
我正在使用SQLplus连接到oracle数据库12c 我有两个表,Customer和Account,其中客户可以有多个帐户(一个客户id,但有多个帐户类型)。我正试图获得关于负债最多的客户的信息。假设我们有以下信息: 客户表:Sql 从按某个id分组的多行总和中查找最小值,sql,oracle12c,Sql,Oracle12c,我正在使用SQLplus连接到oracle数据库12c 我有两个表,Customer和Account,其中客户可以有多个帐户(一个客户id,但有多个帐户类型)。我正试图获得关于负债最多的客户的信息。假设我们有以下信息: 客户表: BSB# Customer# Name Address ------------------------------ 0123 123456 Adam ABC st 0234 234566 Dave CBC rd 0345 345667
BSB# Customer# Name Address
------------------------------
0123 123456 Adam ABC st
0234 234566 Dave CBC rd
0345 345667 Max DSE st
科目表:
BSB# Customer# Type Balance
---------------------------------
0123 123456 Saving -2300
0123 123456 Credit -500
0123 123456 iSaver 200
0234 234566 Saving 5000
0345 345667 Credit -1500
0345 345667 iSaver -200
所需输出:
Customer# Name Address
-------------------------
123456 Adam ABC St
我可以打印出每个人的账户余额总和,但我不知道如何打印出账户上最低累计余额的信息。我试着使用MIN(SUM(A.Balance)),但我一直得到一个错误,说“不是一个单组函数”。如果我在某个地方犯了错误,我不会感到惊讶
我对sql比较陌生,这就是我目前所拥有的。任何建议或建议都很好
SELECT C.Customer#, C.Name, Address, SUM(A.Balance)
FROM Customer C
RIGHT OUTER JOIN Account A
ON C.BSB# = A.BSB#
AND
C.Customer# = A.Customer#
GROUP BY C.Customer#, C.Name, Address;
谢谢 以下内容将按余额之和对客户进行排序:
SELECT C.Customer#, C.Name, Address, SUM(A.Balance)
FROM Customer C JOIN
Account A
ON C.BSB# = A.BSB# AND
C.Customer# = A.Customer#
GROUP BY C.Customer#, C.Name, Address
ORDER BY SUM(A.Balance);
如果只需要一行,则这取决于数据库。以下是一些方法:
将选择更改为:
SELECT TOP 1 . . .
在查询末尾添加一个limit
子句:
LIMIT 1
FETCH FIRST 1 ROWS ONLY
在查询末尾添加fetch
子句:
LIMIT 1
FETCH FIRST 1 ROWS ONLY
在Oracle中,您可以通过子查询执行此操作:
SELECT *
FROM (SELECT C.Customer#, C.Name, Address, SUM(A.Balance)
FROM Customer C JOIN
Account A
ON C.BSB# = A.BSB# AND
C.Customer# = A.Customer#
GROUP BY C.Customer#, C.Name, Address
ORDER BY SUM(A.Balance)
) t
WHERE rownum = 1;
你可以使用下面的语句
with MinAccounts as
(
SELECT BSB#, Customer#, Balance
FROM (
SELECT BSB#, t.Customer# , sum(t.Balance) Balance, min(sum(t.Balance)) over () minBalance
FROM Account t
GROUP BY BSB#, Customer#
) d
WHERE Balance = minBalance)
SELECT *
FROM MinAccounts a
JOIN Customer c ON a.BSB# = c.BSB#
哎呀,对不起!我已经编辑,希望在其他人的帮助下,得到正确的标签。谢谢!这就是我要找的!我不知道为什么我以前没有想到使用rownum。@Vince。Oracle 12引入了fetch first
子句,因此您也可以使用它()。实际上,我忍不住注意到“WHERE row num=1”之前的“t”。没有它,代码似乎运行得很好,所以我忍不住想知道t的重要性。@Vince。这是一个表别名,在Oracle中是可选的。在许多数据库中,它是必需的,因此我通常习惯性地将其包括在内。