2016-03-09 28 views
0

我有一个查询,我一直在使用它来跟踪用户的销售情况。以前他们每个月都需要配额。然而,现在他们想改变规则,让他们在任何一个月开始,所以他们可能会从六月份到六月份,或者其他任何事情。他们还希望用户在错过一个月后立即重新开始。这看起来似乎是一个更公平的制度,因为如果他们在三月份没有取得配额,例如他们无法计算他们在这个月之后所做的全年的任何配额。这确实弄乱了我的查询,但我不知道如何解决它。任何人都有解决方案?按月选择滚动总计更多数据

这里是现有的t-sql。

@Year int 
    AS 
    BEGIN 


    DECLARE @DateStart datetime 
    DECLARE @DateStop datetime 

    SELECT @DateStart = CONVERT(DATETIME, CONVERT(char(4), @Year) + '-01-  01') 
    SELECT @DateStop = CONVERT(DATETIME, CONVERT(char(4), @Year + 1) + '-01-  01') 
SET NOCOUNT ON; 

SELECT r.riderid, 
    r.dname, 
    DATEPART(yyyy, m.ridedate), 
    SUM(CASE DATEPART(mm, m.datesale) WHEN 1 THEN m.quota  ELSE   0 END) AS [jan], 
    SUM(CASE DATEPART(mm, m.datesale) WHEN 2 THEN m.quota ELSE 0    END) AS [feb], 
    SUM(CASE DATEPART(mm, m.datesale) WHEN 3 THEN m.quota ELSE 0 END) AS [mar], 
    SUM(CASE DATEPART(mm, m.datesale) WHEN 4 THEN m.quota ELSE 0 END) AS [apr], 
    SUM(CASE DATEPART(mm, m.datesale) WHEN 5 THEN m.quota ELSE 0 END) AS [may], 
    SUM(CASE DATEPART(mm, m.datesale) WHEN 6 THEN m.quota ELSE 0 END) AS [jun], 
    SUM(CASE DATEPART(mm, m.datesale) WHEN 7 THEN m.quota ELSE 0 END) AS [jul], 
    SUM(CASE DATEPART(mm, m.datesale) WHEN 8 THEN m.quota ELSE 0 END) AS [aug], 
    SUM(CASE DATEPART(mm, m.datesale) WHEN 9 THEN m.quota ELSE 0 END) AS [sep], 
    SUM(CASE DATEPART(mm, m.datesale) WHEN 10 THEN m.quota ELSE 0 END) AS [oct], 
    SUM(CASE DATEPART(mm, m.datesale) WHEN 11 THEN m.quota ELSE 0 END) AS [nov], 
    SUM(CASE DATEPART(mm, m.datesale) WHEN 12 THEN m.quota ELSE 0 END) AS [dec], 
    SUM(m.quota) as [tot] 

FROM users u 
    JOIN mysales m 
    ON m.riderid = u.riderid 
Where m.datesale Between @DateStart AND @DateStop 
GROUP BY DATEPART(yyyy, m.datesale), u.userid 

ORDER BY DATEPART(yyyy, m.datesale), SUM(m.quota) DESC 


END 

OK,尤其是圆形的数据 的表保存用户ID,客户编号,销售金额和销售 日期查询拉用户,销售额月的总和。用户250在2016年7月份取得了名额,但在8月没有取得名额,因此他应该在7月和9月份进入#quota,但由于他没有在8月份,他必须在9月份重新开始; 300号用户已经从2016年1月到9月份取得了配额,所以只要他完成了12个月,他就有资格获得奖金。用户350已经成功完成了一年,并且应该获得奖金。在这个时候,没有配额表,这会简化吗?我需要的是正在运行的用户列表。

--drop table #sales 
--drop table #quota 
create table #sales 
(
    --saleid int --PK 
    userid int -- salesperson FK 
, customerid int --FK 
, sale_amt decimal 
, date_sale datetime 
) 


insert into #sales values 
(300,1301,542.90,'3-2-2016'),                     
(300,1301,782.70,'3-4-2016'), 
(300,1541,600.70,'3-7-2016'), 
(300,903,640.71,'3-10-2016'), 
(300,1745,900.01,'3-29-2016'), 
(300,1440,2040.71,'2-10-2016'), 
(300,903,640.71,'2-20-2016'), 
(300,414,1489.00,'1-18-2016'), 
(300,1645,1322.00,'1-20-2016'), 
(300,1200,1156.09,'4-2-2016'), 
(300,1204,1456.00,'4-20-2016'), 
(250,1140,156.89,'4-12-2016'), 
(250,1240,1176.69,'4-14-2016'), 
(250,840,480.61,'4-17-2016'), 
(250,1940,500.71,'5-17-2016'), 
(250,1425,4800.61,'6-1-2016'), 

(250,1840,701.32,'6-15-2016'), 
(250,1840,701.32,'7-15-2016'), 
(250,1840, 2701.32,'8-15-2016'), 
(450,8421,2500.61,'7-17-2015'), 
(450,8422,2500.1,'8-17-2015'), 
(450,843,2500.1,'9-17-2015'), 
(450,8431,2500.00,'10-17-2015'), 
(450,1431,2500.00,'11-17-2015'), 
(450,4311,2500.00,'12-17-2015'), 
(450,4310,2500.00,'1-17-2016'), 
(450,1310,2500.00,'2-17-2016'), 
(450,1310,2500.00,'3-17-2016'), 
(450,130,2500.00,'4-17-2016'), 
(450,1130,2500.00,'5-17-2016'), 
(450,113,2500.00,'6-17-2016') 

Select userid 
, sum(sale_amt)  Sale 
, DATEPART(mm,date_sale) as[month] 
from #sales 
group by userid, DATEPART(mm,date_sale) order by userid 

create table #quota 
( 
    qid int --PK 
, userid int -- salesperson FK 
, quota bit -- awarded when sales => $2500.00 
, datesale datetime -- date quota made 
) 
+0

哪个版本的SQL Server?不“跑步”意味着他们在上个月达到了配额*。这是一个简单的查询。 – shawnt00

回答

0

只是一种可能的方式来编写一个查询,回顾@running_months数个月的验证没有配额窗口为每个用户在被遗漏:

select userid from users u 
where not exists (
    select 1 from #sales s 
    where s.userid = u.userid 
     and date_sale > dateadd(month, [email protected]_months - 1, current_timestamp) 
     and datediff(month, sales_date, current_timestamp) between 1 and @running_months 
    group by month(sales_amt) 
    having sum(sales_amt) < 2500 
) 

编辑:我后来意识到您可能确实有一个月没有销售的用户,因此您可能需要实际验证所有月份超过配额的情况,而不是每个月都没有配额:

select userid from users u 
where userid in (
    select userid from 
    (
     select userid from #sales s 
     where s.userid = u.userid 
      and date_sale > dateadd(month, [email protected]_months - 1, current_timestamp) 
      and datediff(month, sales_date, current_timestamp) between 1 and @running_months 
     group by month(sales_amt) 
     having sum(sales_amt) >= 2500 
    ) q 
    group by userid 
    having count(*) = @running_months 
)