您如何在 SQL 服务器的 While 循环中 join/union Select 查询的结果?

How do you join/union the results of Select queries within a While loop in SQL Server?

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

基本的objective是看哪些日期最受客户使用该服务的欢迎,只要他们购买(serviceduration)就可以持续。请记住,我指的是 for 购买服务的日期——第一天是 servicedate 列——而不是购买服务的日期.

这个 @d 是我的可变日期,我检查有多少交易在其服务期限范围内包含该日期。现在,这会输出一堆不同的 select table。我真的很想在 While 循环的前一次迭代的输出中添加一行,使一个 table 每个日期有 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

编辑:我认为它做到了 -->

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

您可以改用计数 table。不太确定您正在执行的聚合逻辑,但这非常接近。在我的系统中,我实际上有一个名为 cteTally 的视图,但在这里我将其拆分出来。这是一篇关于计数 tables 以及如何利用它们替换循环的优秀文章。计数 table 被一些人称为 "Swiss Army knife of 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