Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用max()和sum()_Sql_Oracle_Aggregate - Fatal编程技术网

Sql 使用max()和sum()

Sql 使用max()和sum(),sql,oracle,aggregate,Sql,Oracle,Aggregate,我需要找到“2009年盈利最多的分行名称”。我的表格如下: Rental (cid, copyid, outdate, returndate, cost) Copy (copyid, mid, bid) Branch (bid, bname, baddress) 我已经编写了以下代码,它输出所有分支的总和,但我需要赚最多钱的分支的总和。我不知道如何在同一个查询中联接max()和sum()函数。我正在使用Oracle 2007 输出分支名称和总和(我得到所有分支的摘要): 输出总和的最大值(

我需要找到“2009年盈利最多的分行名称”。我的表格如下:

Rental
(cid, copyid, outdate, returndate, cost)

Copy
(copyid, mid, bid)

Branch
(bid, bname, baddress)
我已经编写了以下代码,它输出所有分支的总和,但我需要赚最多钱的分支的总和。我不知道如何在同一个查询中联接max()和sum()函数。我正在使用Oracle 2007

输出分支名称和总和(我得到所有分支的摘要):

输出总和的最大值(我不使用此值获取分支名称):


如何合并这两个分支以仅获得最大和分支名称?

为什么不从第一个查询中获取最上面一行

   SELECT * FROM (
            SELECT bname, sum(cost) as Total
            FROM rented R join copy C on R.copyid = C.copyid join branch B on C.bid = B.bid
            WHERE outdate between '20090101' and '20091231' 
            GROUP BY bname
            ORDER BY sum(cost) desc) 
   WHERE ROWNUM=1;
然而,有一件事你可能忘记了,那就是两个分支机构可以相互联系,以赚取最多的钱。如果您希望包括所有参与排名第一的分支机构,您可以使用类似的工具(Oracle 9i或更高版本)


为什么不从第一个查询中抓取第一行呢

   SELECT * FROM (
            SELECT bname, sum(cost) as Total
            FROM rented R join copy C on R.copyid = C.copyid join branch B on C.bid = B.bid
            WHERE outdate between '20090101' and '20091231' 
            GROUP BY bname
            ORDER BY sum(cost) desc) 
   WHERE ROWNUM=1;
然而,有一件事你可能忘记了,那就是两个分支机构可以相互联系,以赚取最多的钱。如果您希望包括所有参与排名第一的分支机构,您可以使用类似的工具(Oracle 9i或更高版本)


很多方法。例如,保留原始查询时,可以按总和对数据排序,然后只取第一行:

select * from (
SELECT bname, sum(cost) as Total 
FROM rented R join copy C on R.copyid = C.copyid join branch B on C.bid = B.bid 
WHERE outdate between '20090101' and '20091231' 
GROUP BY bname
order by sum(cost) desc
)
where rownum = 1; 

很多方法。例如,保留原始查询时,可以按总和对数据排序,然后只取第一行:

select * from (
SELECT bname, sum(cost) as Total 
FROM rented R join copy C on R.copyid = C.copyid join branch B on C.bid = B.bid 
WHERE outdate between '20090101' and '20091231' 
GROUP BY bname
order by sum(cost) desc
)
where rownum = 1; 

谢谢我以前没有使用过rownum,我对sql还很陌生。我尝试使用top 1,但Oracle似乎无法识别它,除非我使用错误。
ROWNUM
将在
ORDER BY
之前进行计算,因此您将得到一个结果,但不一定是您想要的结果。您需要将查询和user
ROWNUM
包装在顺序之后,如@Jim Hudson的答案所示。@Alex Poole-说得好。还修复了我答案中的另一个错误。谢谢!!我以前没有使用过rownum,我对sql还很陌生。我尝试使用top 1,但Oracle似乎无法识别它,除非我使用错误。
ROWNUM
将在
ORDER BY
之前进行计算,因此您将得到一个结果,但不一定是您想要的结果。您需要将查询和user
ROWNUM
包装在顺序之后,如@Jim Hudson的答案所示。@Alex Poole-说得好。还修复了我答案中的另一个错误。
select * from (
SELECT bname, sum(cost) as Total 
FROM rented R join copy C on R.copyid = C.copyid join branch B on C.bid = B.bid 
WHERE outdate between '20090101' and '20091231' 
GROUP BY bname
order by sum(cost) desc
)
where rownum = 1;