2010-02-21 1 views
1
select * 
from 
( 
    select year, 
      week, 
      salesperson, 
      count(*) as transactions, 
      rank() over(partition by week order by count(*) desc) as ranking 
    from sales 
    where year = '2010',    
    group by year, 
       week, 
       salesperson 

) temp 
where ranking <= 10 

Запрос возвращает список 10 лучших продавцов (по количеству транзакций) за каждую неделю года.SQL Server: 10 лучших продавцов в неделю - и предыдущий рейтинг

Как я могу идти о добавлении столбцов в мои результаты для:

  1. прошлой недели рейтинга для этого продавец
  2. Всего недель в топ-10 в этом году
  3. недель подряд в Топ-10 (начиная с 1-й недели)
  4. Последовательные недели в топ-10 (начиная с прошлого года, если это возможно)

Можете ли вы дать общий совет о том, как решить эти проблемы?

PS: Использование сервера SQL 2008

+0

Чтобы узнать значения предыдущих недель, вам нужно знать, что такое текущая неделя ... –

ответ

0

Мой совет, чтобы сделать другие запросы отдельно в представлениях, а затем присоединиться к ним в по saleperson (который я предполагаю, что это ключ)

Логика такого запроса хорошо и чисты и легко следовать. В противном случае - я думаю, что способ атаковать это будет, чтобы начать писать функции TSQL для вычисления других значений, но я думаю, что эти функции будут иметь в них запросы в любом случае.

+0

Это похоже на путь. Спасибо за совет :-) – user246211

1

На самом деле, я не уверен, что Мнения - лучший способ пойти. Вы можете сделать такую ​​логику в CTE и объединить всю вещь в один запрос. Например, вот что у меня есть для всего, кроме последовательной логики:

;With 
    SalesDateParts As 
    (
     Select DatePart(wk, SaleDate) As WeekNum, DatePart(yy, SaleDate) As [Year], SalesPersonId 
     From #Sales 
    ) 
    , SalesByWeek As 
    (
     Select [Year], WeekNum, SalesPersonId, Count(*) As SaleCount 
      , RANK() OVER(PARTITION BY [Year], [WeekNum] ORDER BY Count(*) DESC) As SaleRank 
     From SalesDateParts 
     Group By [Year], WeekNum, SalesPersonId 
    ) 
    , PrevWeekTopSales As 
    (
     Select [Year], [WeekNum], SalesPersonId, SaleCount 
     From SalesByWeek 
     Where [Year] = DatePart(yyyy, DateAdd(d, -7, CURRENT_TIMESTAMP)) 
      And WeekNum = DatePart(wk, DateAdd(d, -7, CURRENT_TIMESTAMP)) 
    ) 
    , WeeksInTop10 As 
    (
     Select SalesPersonId, Count(*) As Top10Count 
     From SalesByWeek 
     Where SaleRank <= 10 
     Group By SalesPersonId 
    ) 
Select * 
From Salespersons 
    Left Join WeeksInTop10 
     On WeeksInTop10.SalesPersonId = SalesPersons.SalesPersonId 
    Left Join PrevWeekTopSales 
     On PrevWeekTopSales.SalesPersonId = SalesPersons.SalesPersonId 

Логика «подряд», вероятно, будет требовать календарную таблицу, содержащую значение для каждого дня вместе с колоннами на данный Дейта год и неделю.

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