您如何在 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
这是我目前所拥有的。这是基本的,可能是一种倒退的方式来做到这一点。
基本的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