2010-02-21 179 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的銷售人員 - 以及之前的排名

我怎麼能去添加列到我的結果:在Top 10中的前10名,今年

  1. 此前一週的排名爲 銷售人員
  2. 周總
  3. 連續兩週(從第1周開始)
  4. 前十名中的連續幾周(如果可能,從前一年開始)

您可以就如何解決這些問題提供一般性建議嗎?

PS:使用SQL Server 2008

+0

爲了解前幾周的數值,需要知道本週是什麼... – 2010-02-21 06:00:42

回答

0

我的建議是單獨做其他查詢中的觀點,後來saleperson(我假設是關鍵)加入他們的

的邏輯是這樣的查詢是好的清潔和容易遵循。否則 - 我認爲攻擊的方法是開始編寫TSQL函數來計算其他值,但我認爲這些函數無論如何都會有查詢。

+0

這確實聽起來像是要走的路。感謝您的建議 :-) – user246211 2010-02-21 06:23:36

1

其實,我不相信Views是最好的選擇。您可以在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 

爲「連續」的邏輯可能將需要其中包含每天用給定日期的列沿着價值日曆表一年和一週。