SQL Server: 10 лучших продавцов в неделю и предыдущие рейтинги - PullRequest
1 голос
/ 21 февраля 2010
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 лучших продавцов (с точки зрения количества транзакций) за каждую неделю года.

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

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

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

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

Ответы [ 2 ]

1 голос
/ 21 февраля 2010

На самом деле, я не уверен, что это лучший способ просмотра. Вы можете сделать такую ​​логику в 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

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

0 голосов
/ 21 февраля 2010

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

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

...