【发布时间】:2018-10-17 04:27:51
【问题描述】:
我有以下代码:
create table #attr( enroll_month datetime ,cncl_mth datetime,
mth int,
tot_orders int,tot_cancel int, active_count int, attr_rate int , retn_rate
int
)
DECLARE
@enroll_mth datetime ,@cncl_mth datetime, @mth int ,
@tot_orders numeric, @tot_cancel numeric,
@attr_rate numeric(6,2), @retn_rate numeric(6,2),
@active_count int
DECLARE att_cursor CURSOR FOR
SELECT
d.Enroll_Month, d.cncl_mth, d.mth,
s.tot_orders, d.tot_cancel
FROM #Summary s with (nolock),
#Detail d with (nolock)
WHERE
s.Enroll_Month = d.Enroll_Month
OPEN att_cursor
FETCH NEXT FROM att_cursor INTO @enroll_mth, @cncl_mth, @mth, @tot_orders,
@tot_cancel
DECLARE
@old_enroll_mth datetime,
@old_cncl_mth datetime, @old_mth int, @month datetime ,
@intial varchar(1),
@old_active_cnt int, @old_tot_cancel int,
@old_retn_rate numeric(6,2), @old_attr_rate numeric(6,2),
@counter int
SELECT @old_enroll_mth = ''
SELECT @intial = 'Y'
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@old_enroll_mth <> @enroll_mth)
BEGIN
SELECT @active_count = @active_count - @tot_cancel
SELECT @intial = 'N'
END
ELSE
BEGIN
SELECT @active_count = @tot_orders - @tot_cancel
SELECT @intial = 'Y'
END
SELECT @retn_rate = (@active_count / @tot_orders) * 100
SELECT @attr_rate = 100 - @retn_rate
INSERT INTO #Attr (
enroll_month, cncl_mth, mth, tot_orders, tot_cancel,
active_count, attr_rate, retn_rate )
VALUES (
@enroll_mth, @cncl_mth, @mth, @tot_orders, @tot_cancel,
@active_count, @attr_rate, @retn_rate)
SELECT @old_enroll_mth = @enroll_mth
SELECT @old_mth = @mth
SELECT @old_retn_rate = @retn_rate
SELECT @old_attr_rate = @attr_rate
SELECT @old_active_cnt = @active_count
SELECT @old_cncl_mth = @cncl_mth
SELECT @old_tot_cancel = @tot_cancel
FETCH NEXT FROM att_cursor INTO @enroll_mth, @cncl_mth, @mth, @tot_orders,
@tot_cancel
END
CLOSE att_cursor
DEALLOCATE att_cursor
select * from #attr
返回以下输出。
enroll_month cncl_mth mth tot_orders tot_cancel active_count attr_rate retn_rate
01/01/17 01/01/17 1 390 160 230 41 58
01/01/17 02/01/17 2 390 26 364 6 93
01/01/17 03/01/17 3 390 23 594 -52 152
它正在显示 mth=1 的活动计数的正确值。虽然对于 mth= 2 它应该是 (230-26=204) 而对于 mth = 3 它应该是 (204-23 =181)。
我已经发布了两个脚本来填充上面脚本中使用的摘要和详细信息表。
create table #summary
(
enroll_month datetime,
tot_orders int
)
go
insert into #summary(enroll_month, tot_orders)
values ('2017-01-01 00:00:00.000', 390)
insert into #summary(enroll_month, tot_orders )
values ('2017-02-01 00:00:00.000', 615)
go
drop table #Detail
go
create table #detail
(
enroll_month datetime,
cncl_mnth datetime,
mth int,
tot_cancel int
)
go
insert into #detail(enroll_month,cncl_mnth,mth,tot_cancel)
values ('2017-01-01 00:00:00.000', '2017-01-01 00:00:00.000', 1, 160)
insert into #detail(enroll_month,cncl_mnth,mth,tot_cancel )
values ('2017-01-01 00:00:00.000','2017-02-01 00:00:00.000', 2, 26)
insert into #detail(enroll_month,cncl_mnth,mth,tot_cancel)
values ('2017-01-01 00:00:00.000','2017-03-01 00:00:00.000', 3, 23)
go
你能帮忙吗?
谢谢, 帕姆
【问题讨论】:
-
你能发布查询的执行计划吗(我已经在我的回答中发布了一个例子)?您使用的是什么版本的 SQL Server?两个表中的
[enroll_month]列上是否有索引?您能否发布更多示例记录,以便我可以根据模式构建 250 条记录?
标签: sql-server tsql