我试图在显示的每一年成为一组行的MAX值 . 我可以看到我必须做什么,我似乎无法将其转换为代码 .
select YEAR(O.Orderdate) [Year] , SUM(O.Freight) [Total Freight], S.CompanyName
from Orders O inner join Shippers S on S.ShipperID = O.ShipVia
group by S.CompanyName, YEAR(O.Orderdate)
1996 4233,78
1996 2297,42
1996 3748,67
1997 11413,35
1997 8681,38
1997 12374,04
1998 4865,38
1998 5206,53
1998 12122,14
该代码每年返回每家公司的总运费(尽管公司名称未显示) . 然后我需要每年获得最高的运费 .
我使用了以下代码,但是它返回了所有年份的最高值,虽然我知道它是错的,但我看不到逻辑或者每年分别返回最高值的方法......
select YEAR(O.Orderdate) [Year] , SUM(O.Freight) [Total Freight]
from Orders O inner join Shippers S on S.ShipperID = O.ShipVia
group by S.CompanyName, YEAR(O.Orderdate)
having SUM(O.Freight) >= ALL (
select SUM(O.Freight)
from Orders O join Shippers S on S.ShipperID = O.ShipVia
group by YEAR(O.Orderdate), S.CompanyName
)
返回:
1997 12374,04
我的目标是:
1996 4233,78
1997 12374,04
1998 12122,14
我不需要一个公然的解决方案,我真的更喜欢我做错了什么/我应该做什么的逻辑 . 提前致谢 !
3 回答
您应该使用MAX运算符
为什么你加入托运人表,如果你不需要任何信息它有点无用......?
您的查询检查货运值的总和是否大于等于所有值,因此只匹配1997年的最大值,因此只返回一行
如果你想要每年最多,我会选择@Gordon回答,但根据评论,你想要使用Group by和having .
这是通过在子查询中使用当前查询的另一种方法 .
我建议使用窗口函数: