只有一个循环:
-- tables
create table #prices (
PricelistID int,
periodID int,
periodstart datetime,
periodend datetime,
price int)
create table #interval_price (
PricelistID int,
price int,
period datetime
)
create table #test_gaps (
PricelistID int,
times int
)
-- inserts
insert into #prices values (1,1,convert(datetime, '2011/05/01', 111), convert(datetime, '2011/05/31', 111),50)
insert into #prices values (1,2,convert(datetime, '2011/06/01', 111), convert(datetime, '2011/06/30', 111),70)
insert into #prices values (1,3,convert(datetime, '2011/07/15', 111), convert(datetime, '2011/07/31', 111),80)
insert into #prices values (2,4,convert(datetime, '2011/05/01', 111), convert(datetime, '2011/05/31', 111),100)
insert into #prices values (2,5,convert(datetime, '2011/06/01', 111), convert(datetime, '2011/06/30', 111),110)
insert into #prices values (2,6,convert(datetime, '2011/07/01', 111), convert(datetime, '2011/07/31', 111),120)
-- variables
declare @periodStart datetime, @periodEnd datetime
select @periodStart = convert(datetime, '20110520', 112)
select @periodEnd = convert(datetime, '20110527', 112)
declare @period datetime
select @period = @periodStart
declare @price int, @PriceListID int
while (@period < @periodEnd)
begin
select @price = NULL, @PriceListID = NULL
insert into #interval_price select PricelistID, price, @period from #prices where @period >= periodstart and @period < periodend
select @period = dateadd(dd, 1, @period)
end
insert into #test_gaps select PriceListID, count(price) from #interval_price group by PricelistID
if (select count(distinct times) from #test_gaps) = 1
begin
if (select distinct times from #test_gaps) = (select datediff(dd,@periodStart , @periodEnd))
begin
select PriceListID, sum(price) [total] from #interval_price group by PricelistID
end
end
drop table #prices
drop table #interval_price
好看与CTE,但是这个代码不用日期差距解决问题。尝试'2011/06/25' - '2011/07/05'。它不应该返回数据,因为有一段时间缺少2011-07-01 - 2011-07-14。 – mko
哦,我没有注意到差距。不过,我想这可以通过比较来自CTE的COUNT(*)和来自select的COUNT(*)来解决。并把它放在'SUM'的'CASE'语句中。 – Johan