日期:2014-05-19  浏览次数:20628 次

高手进求一个SQL语句的写法
表   test
time                       mumber  
2006-03-01               3
2006-03-02               2
2006-03-03               5
2007-03-01               8
2007-03-02               1
2007-03-03               2

用户输入时间段2007-03-01到2007-03-03
要求结果:
number                 TB
11                         110%
其中TB等于用户输入的时间段中number的和减去去年同期number的和乘以100%也就是算个同期比
望高手们不吝赐教小弟在这里先谢谢各位了

------解决方案--------------------
create procedure protest
@begindate datetime
@enddate datetime
as
declare @oldsum int
select @oldsum =sum(mumber) from tb where time between dateadd(year,-1,@begindate) and dateadd(year,-1,@enddate)
select sum(mumber) number,tb=cast((sum(mumber)-@oldsum )*1.0/oldsum as varchar)+ '% ' from tb where time between @begindate and @enddate
------解决方案--------------------
Create Table test
([time] Varchar(10),
number Int)
Insert test Select '2006-03-01 ', 3
Union All Select '2006-03-02 ', 2
Union All Select '2006-03-03 ', 5
Union All Select '2007-03-01 ', 8
Union All Select '2007-03-02 ', 1
Union All Select '2007-03-03 ', 2
GO
Declare @StartDate DateTime, @EndDate DateTime
Select @StartDate = '2007-03-01 ', @EndDate = '2007-03-03 '
Select
number,
Rtrim(Cast((number - LastYearnumber) * 100.0 / LastYearnumber As Int)) + '% ' As TB
From
(
Select
SUM(number) As number,
(Select SUM(number) From test Where [time] Between DateAdd(yy, -1, @StartDate) And DateAdd(yy, -1, @EndDate)) As LastYearnumber
From
test
Where [time] Between @StartDate And @EndDate
) A
GO
Drop Table test
--Result
/*
number TB
11 10%
*/
------解决方案--------------------
if object_id( 'pubs..tb ') is not null
drop table tb
go

create table tb(time datetime,number int)
insert into tb(time,number) values( '2006-03-01 ', 3)
insert into tb(time,number) values( '2006-03-02 ', 2)
insert into tb(time,number) values( '2006-03-03 ', 5)
insert into tb(time,number) values( '2007-03-01 ', 8)
insert into tb(time,number) values( '2007-03-02 ', 1)
insert into tb(time,number) values( '2007-03-03 ', 2)
go

declare @time1 as datetime
declare @time2 as datetime
set @time1 = '2007-03-01 '
set @time2 = '2007-03-03 '

select m.number , cast(cast((m.number*1.00 - n.number)/n.number*100 as decimal(18,2)) as varchar) + '% ' TB from
(select sum(number) as number from tb where time > = @time1 and time <= @time2) m,
(select sum(number) as number from tb where time > = dateadd(year, -1 , @time1) and time <= dateadd(year , -1 ,@time2)) n


drop table TB

/*
number TB
----------- -------------------------------
11 10.00%

(所影响的行数为 1 行)


*/