2014-01-06 3 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

1-й столбец: год (список) 2-я колонка: 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 в order by в предложении over(), чтобы вы всегда получали одну и ту же строку. Если в том же случае TotalFreight вы хотели бы вернуть несколько строк, используйте dense_rank(), а не row_number().

Смежные вопросы