2014-01-06 102 views
0

我必須在每一年展示哪個託運人的最大總成本。 我的查詢現在每年顯示每個託運人的總成本。所以在結果中,我必須列出年份,每年的託運人和總成本。 在此先感謝。查詢子查詢,每年有1個結果(最大)

select year(OrderDate), s.ShipperID, sum(freight) 
from orders o 
join shippers s on o.ShipVia = s.ShipperID 
group by year(OrderDate),s.ShipperID 
+0

儘量用更多的信息來解釋,這將有助於我們得到你.. –

+0

它可以幫助你如何發佈你需要的預期結果返回 – Kane

+0

第一列:年份(列表)第二列: shipperID(當年成本最高的那個)和第3列:該年的託運人總成本。 – user3163154

回答

0

內部查詢一個是你的原始查詢,獲得由託運人的貨物價值。

內部查詢max獲取每年的最大值,然後查詢max加入查詢a,將a中的行限制爲那些年份爲=的年份的最大值。

乾杯 -

+0

非常感謝西蒙。結果是完美的!會有一個更短的方式來做到這一點或是這樣嗎?電賀 – user3163154

0

如果您使用窗口函數,它會稍微縮短。

select shippers_ranked.OrderYear as OrderYear, 
     shippers_ranked.ShipperId as ShipperId, 
     shippers_ranked.TotalFreight as TotalFreight 
from 
(
    select shippers_freight.*, row_number() over (partition by shippers_freight.OrderYear order by shippers_freight.TotalFreight desc) as Ranking 
    from 
    (
     select year(OrderDate) as OrderYear, 
       s.ShipperID as ShipperId, 
       sum(freight) as TotalFreight 
     from orders o 
     inner join shippers s on o.ShipVia = s.ShipperID 
     group by year(OrderDate), s.ShipperID 
    ) shippers_freight 
) shippers_ranked 
where shippers_ranked.Ranking = 1 
order by shippers_ranked.OrderYear 
; 

你需要決定你想什麼發生如果兩個託運人有一年相同TotalFreight - 就像上面的代碼代表你會得到一個行(非確定性)。如果您想要一行,我會將ShipperId添加到over()子句中的order by,以便始終獲得同一行。如果在同一TotalFreight情況下,您希望返回多行,請使用dense_rank()而不是row_number()