SQL-сервер:10 лучших продавцов за неделю — и предыдущие рейтинги

StackOverflow https://stackoverflow.com/questions/2304955

Вопрос

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. Недели подряд в Топ-10 (начиная с первой недели)
  4. Недели подряд в Топ-10 (если возможно, начиная с предыдущего года)

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

ПС:Использование SQL-сервера 2008.

Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top