如何在SQL Server的While循环中加入/联合Select查询的结果?

时间:2015-10-01 13:22:46

标签: sql-server join while-loop union

这是我到目前为止所拥有的。这是一个基本的,可能是一个倒退的方式来做到这一点。

基本目标是查看哪些日期对于使用该服务的客户最受欢迎,只要他们购买服务(服务化)就会持续。请记住,我指的是购买服务的日期 - 第一天是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

1 个答案:

答案 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