Sql server 选择按月滚动总计更多数据

Sql server 选择按月滚动总计更多数据,sql-server,Sql Server,我有一个用于跟踪用户销售的查询。以前,他们被要求每月制定一个配额。然而,现在他们想改变规则,允许他们开始任何一个月,所以他们可以从六月到六月或其他任何时间。他们还希望用户在错过一个月后立即重新开始。这似乎是一个更公平的制度,因为如果他们没有在3月份完成配额,他们就无法计算在该月份之后全年的配额。但这确实把我的查询搞砸了,我不知道如何修复它。有人有办法吗 下面是现有的t-sql @Year int AS BEGIN DECLARE @DateStart date

我有一个用于跟踪用户销售的查询。以前,他们被要求每月制定一个配额。然而,现在他们想改变规则,允许他们开始任何一个月,所以他们可以从六月到六月或其他任何时间。他们还希望用户在错过一个月后立即重新开始。这似乎是一个更公平的制度,因为如果他们没有在3月份完成配额,他们就无法计算在该月份之后全年的配额。但这确实把我的查询搞砸了,我不知道如何修复它。有人有办法吗

下面是现有的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
好的,这是数据 该表包含用户id、客户id、销售金额和销售日期 查询提取用户每月的销售额总和。用户250在2016年7月制定了配额,但在8月没有,因此他应该在7月和9月获得配额条目,但因为他在8月没有,所以他必须在9月重新启动;用户300已在2016年1月至9月期间完成配额,因此只要他完成12个月的任务,他就有资格获得奖金。用户350已成功完成本年度,应获得奖金。目前prod中没有配额表,这会简化吗?我需要的是正在运行的用户列表

--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
)

只有一种可能的方法可以编写一个查询,该查询可以回溯@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, -@running_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
)

哪个版本的SQL Server?这并不意味着他们上个月就达到了限额。这是一个简单的问题。
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, -@running_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
)