Sql 使用max()和sum()
我需要找到“2009年盈利最多的分行名称”。我的表格如下: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 输出分支名称和总和(我得到所有分支的摘要): 输出总和的最大值(
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
之前进行计算,因此您将得到一个结果,但不一定是您想要的结果。您需要将查询和userROWNUM
包装在顺序之后,如@Jim Hudson的答案所示。@Alex Poole-说得好。还修复了我答案中的另一个错误。谢谢!!我以前没有使用过rownum,我对sql还很陌生。我尝试使用top 1,但Oracle似乎无法识别它,除非我使用错误。ROWNUM
将在ORDER BY
之前进行计算,因此您将得到一个结果,但不一定是您想要的结果。您需要将查询和userROWNUM
包装在顺序之后,如@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;