这是我到目前为止所拥有的。这是一个基本的,可能是一个倒退的方式来做到这一点。
基本目标是查看哪些日期对于使用该服务的客户最受欢迎,只要他们购买服务(服务化)就会持续。请记住,我指的是为购买服务的日期 - 第一天是servicedate
列 - 而不是购买服务的日期。
此@d
是我的变量日期,我会检查在其服务持续时间范围内包含该日期的交易数量。现在,这会输出一堆不同的选择表。我真的很喜欢它只是在While循环的前一次迭代的输出中添加一行,以使一个表有2列,每行一行。
见下文:
Declare @d date = '2015-11-01'
While @d < '2016-3-31'
Begin
Select
date = @d,
SUM(qty * CASE WHEN @d between servicedate and dateadd(day, serviceduration, servicedate) THEN 1 END)
From RI
Where confdate > '2015-08-31'
Set @d = dateadd(day, 1, @d)
End
编辑:我认为这样做了 - &gt;
Create Table #TblD(Dt date, Num int)
Declare @d date = '2015-11-01'
While @d < '2016-3-31'
Begin
Insert into #TblD(Dt,Num)
Values(@d, (Select SUM( qty * CASE WHEN @d between servicedate and dateadd(day,serviceduration,servicedate) THEN 1 END) from RI where confdate>'2015-08-31'))
Set @d=dateadd(day,1,@d)
End
Select * from #TblD
答案 0 :(得分:1)
您可以使用计数表。对你正在进行的聚合的逻辑不太确定,但这非常接近。在我的系统中,我实际上有一个名为cteTally的视图,但在这里我把它分开了。这是一篇关于计数表以及如何利用它们来替换循环的优秀文章。理货表被一些人称为“瑞士军刀t-sql”。 http://www.sqlservercentral.com/articles/T-SQL/62867/
declare @StartDate date = '2015-11-01'
, @EndDate date = '2016-03-31';
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
),
MyDates as
(
select DATEADD(day, N - 1, @StartDate) as CurrentDate
from cteTally
where N <= DATEDIFF(day, @StartDate, @EndDate) + 1
)
select md.CurrentDate
, SUM(qty)
from MyDates md
left join RI on RI.servicedate = md.CurrentDate
and md.CurrentDate <= DATEADD(DAY, serviceduration, servicedate)
group by md.CurrentDate