2015-03-25 58 views
0

我需要一些關於SQL Server問題的幫助。每週獲得最佳銷售代表SQL

我有2個表:

complete_sales_raw       
(
    Id int Identity(1,1) PK,         
    RepId int FK in sale_reps,         
    Revenue decimal(15,2),      
    Sale_date datetime2(7) 
) 

sale_reps 
(
    Id int Identity(1,1) PK, 
    RepName nvarchar(50) 
) 

我需要做的就是基於總收入,每星期最好的銷售代表,從2014-06-01並在當前日期結束。

每週有7天,第一天是2014-06-01。

到目前爲止我在這裏:

SELECT TOP(1) 
    sr.RepName as RepName, 
    SUM(csr.Revenue) as Revenue 
INTO #tmp1 
FROM complete_sales_raw csr 
JOIN sale_reps sr on csr.RepId = sr.Id 
WHERE DATEDIFF(d,'2014-06-01', Sale_date) BETWEEN 0 and 6 
GROUP BY sr.RepName 
ORDER BY 2 desc 

但這僅返回最佳銷售代表的第一個星期,我需要它每星期。

所有幫助表示讚賞。

+0

哪個版本的SQL Server? – 2015-03-25 11:50:14

+0

使用日曆表。 – dean 2015-03-25 11:50:20

+0

SQL Server 2008 – 2015-03-25 11:51:22

回答

0

您可以進行彙總以按周獲得總銷售額。這就要求日期的一些操作來計算週數 - 由7

基本上除以天,然後,使用rank()(或row_number()如果你只想一個當有關係),以獲得最高值:

SELECT s.* 
FROM (SELECT tsr.RepName as RepName, 
      (DATEDIFF(day, '2014-06-01', MAS_PostDate) - 1)/7 as weeknum, 
      SUM(csr.Revenue) as Revenue, 
      RANK() OVER (PARTITION BY (DATEDIFF(day, '2014-06-01', MAS_PostDate) - 1)/7 ORDER BY SUM(csr.Revenue)) as seqnum 
     FROM complete_sales_raw csr JOIN 
      sale_reps sr 
      on csr.RepId = sr.Id 
     WHERE DATEDIFF(day, '2014-06-01', MAS_PostDate) BETWEEN 0 and 6 
     GROUP BY sr.RepName, (DATEDIFF(day, '2014-06-01', MAS_PostDate) - 1)/7 
    ) s 
WHERE seqnum = 1; 
+0

querry返回「無效的列名'weeknum'。」 – 2015-03-25 12:00:06

+0

@PeterSandu。 。 。這就是我所說的「如意編碼」。該表達式是需要的而不是列別名。 – 2015-03-26 02:23:51

0

好了,所以,我創建了一個星期的表像這樣

IF (OBJECT_ID('dbo.tmp4') IS NOT NULL) 
    DROP TABLE dbo.tmp4 
GO 

Create Table tmp4(
StartDate datetime,Enddate datetime,WeekNo varchar(20) 
) 

DECLARE 
@start_date DATETIME, 
@end_date DATETIME, 
@start_date1 DATETIME, 
@end_date1 DATETIME 
DECLARE @Table table(StartDate datetime,Enddate datetime,WeekNo varchar(20)) 
Declare @WeekDt as varchar(10) 
SET @start_date = '2014-06-01' 
SET @end_date = '2015-01-03' 

Set @WeekDt = DATEPART(WEEK,@start_date) 
SET @start_date1 = @start_date 

While @start_date<[email protected]_date 
Begin 
--Select @start_date,@start_date+1 
IF @WeekDt<>DATEPART(WEEK,@start_date) 
BEGIN 
Set @WeekDt = DATEPART(WEEK,@start_date) 
SET @[email protected]_date-1 
INSERT INTO tmp4 Values(@start_date1,@end_date1,DATEPART(WEEK,@start_date1)) 
SET @start_date1 = @start_date 
END 

set @start_date = @start_date+1 

END 
GO 

,然後我用戈登的回答並提出這樣的:

SELECT t.StartDate as StartDate, sr.RepName as RepName, SUM(csr.Revenue) as    Revenue, 
RANK() OVER (PARTITION BY (t.StartDate) ORDER BY SUM(csr.Revenue) desc) as seqnum into tmp1 
FROM tmp4 t, 
    complete_sales_raw csr 
JOIN sale_reps sr on csr.RepId = sr.Id 
WHERE DATEDIFF(d,t.StartDate, MAS_PostDate) BETWEEN 0 and 6 
GROUP BY sr.RepName, t.StartDate 

SELECT * FROM tmp1 
WHERE seqnum = 1 
ORDER BY StartDate 

哪個返回每週最好的sales_rep