2015-03-25 61 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