Pergunta

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

A consulta retorna uma lista dos 10 principais vendedores (em termos de nº de transações) para cada semana do ano.

Como posso adicionar colunas aos meus resultados para:

  1. Classificação da semana anterior para aquele vendedor
  2. Total de semanas entre os 10 primeiros deste ano
  3. Semanas consecutivas no top 10 (a partir da semana 1)
  4. Semanas consecutivas entre os 10 primeiros (a partir do ano anterior, se possível)

Você pode dar algum conselho geral sobre como fazer esses tipos de problemas?

PS: Usando o SQL Server 2008

Foi útil?

Solução

Meu conselho é fazer as outras consultas separadamente em visualizações e depois se juntar a elas por Saleperson (o que eu presumo ser fundamental)

A lógica é que esta consulta é agradável, limpa e fácil de seguir. Caso contrário - acho que a maneira de atacar isso seria começar a escrever funções TSQL para calcular os outros valores, mas acho que essas funções terão as consultas de qualquer maneira.

Outras dicas

Na verdade, não estou convencido de que as opiniões sejam o melhor caminho a percorrer. Você pode fazer esse tipo de lógica no CTE e combinar a coisa toda em uma única consulta. Por exemplo, aqui está o que tenho para tudo, exceto a lógica consecutiva:

;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

A lógica para "consecutiva" provavelmente exigirá uma tabela de calendário que contém um valor para todos os dias, juntamente com as colunas para o ano e a semana da data.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top