Sql 从按某个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

我正在使用SQLplus连接到oracle数据库12c

我有两个表,Customer和Account,其中客户可以有多个帐户(一个客户id,但有多个帐户类型)。我正试图获得关于负债最多的客户的信息。假设我们有以下信息:

客户表:

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中是可选的。在许多数据库中,它是必需的,因此我通常习惯性地将其包括在内。