|
问: 有一个表如下: ID saleDate Price 1 2008-1-1 40 2 2008-1-1 50 3 2008-1-2 24 6 2008-1-2 10 7 2008-1-3 12 8 2008-1-3 20 .... 要写一个存储过程,统计一段时间内各连续ID的价格合计,得到以下结果: 比如 2008-1-1到2008-1-3,得到的结果为: ID_Range Totoal_Price 1-3 114 6-7 42 如果统计的是2008-1-1到2008-1-2,得到的结果是 ID_Range Totoal_Price 1-3 114 6 10 请问如何写这个存储过程? 答:
if object_id('tempdb..#T') is not null
drop table #T
create table #T(ID int,SaleDate datetime,Price int)
insert into #T select 1 , '2008-1-1' , 40
insert into #T select 2 , '2008-1-1' , 50
insert into #T select 3 , '2008-1-2' , 24
insert into #T select 6 , '2008-1-2' , 10
insert into #T select 7 , '2008-1-3' , 12
insert into #T select 8 , '2008-1-3' , 20
go

create proc p_test
(
@begin_date datetime,
@end_date datetime
)
as
select ID=ltrim(ID)+
case when exists(select 1 from #T
where SaleDate between @begin_date and @end_date
and ID=a.ID+1) then '-'+
ltrim((select min(ID) from #T b
where SaleDate between @begin_date and @end_date and ID>=a.ID
and not exists(select 1 from #T
where SaleDate between @begin_date and @end_date
and ID=b.ID+1)
)) else '' end ,

Total_Price=(select sum(Price) from #T b
where SaleDate between @begin_date and @end_date
and ID between a.ID and
(select min(ID) from #T b
where SaleDate between @begin_date and @end_date and ID>=a.ID
and not exists(select 1 from #T
where SaleDate between @begin_date and @end_date
and ID=b.ID+1)
) )

from #T a
where SaleDate between @begin_date and @end_date
and not exists
(select 1 from #T where ID=a.ID-1 and SaleDate between @begin_date and @end_date)
go
exec p_test '2008-01-01','2008-01-03'
exec p_test '2008-01-01','2008-01-02'
go
drop table #T
drop proc p_test

 /**//*
ID Total_Price
------------------------- -----------
1-3 114
6-8 42

(所影响的行数为 2 行)

ID Total_Price
------------------------- -----------
1-3 114
6 10

(所影响的行数为 2 行)
*/
|