Table: STU
ID StuID StatusID EFF_Date Cost
1 1 100 01-01-2008 10
1 2 100 01-01-2008 20
1 3 100 02-01-2008 30
1 4 101 02-01-2008 40
1 5 102 03-01-2008 50
StatusID=100代表新学生
要求写一个Store procedure输入EFF_Date,要完成如下逻辑:
对于新学生,计算EFF_Date那一天的数量和COST,再计算EFF_Date之前(包括)所有学生的数量和COST如下例子:如EFF_Date输入01-01-2008
ID 新学生总数 新学生COST 学生总数 总COST
1 2 30 2 30如EFF_Date输入01-02-2008
ID 新学生总数 新学生COST 学生总数 总COST
1 0 0 2 30
如EFF_Date输入02-01-2008
ID 新学生总数 新学生COST 学生总数 总COST
1 1 30 4 100EFF_Date输入02-02-2008
ID 新学生总数 新学生COST 学生总数 总COST
1 0 0 4 100如EFF_Date输入03-01-2008
ID 新学生总数 新学生COST 学生总数 总COST
1 0 0 5 150EFF_Date输入03-02-2008
ID 新学生总数 新学生COST 学生总数 总COST
1 0 0 5 150
ID StuID StatusID EFF_Date Cost
1 1 100 01-01-2008 10
1 2 100 01-01-2008 20
1 3 100 02-01-2008 30
1 4 101 02-01-2008 40
1 5 102 03-01-2008 50
StatusID=100代表新学生
要求写一个Store procedure输入EFF_Date,要完成如下逻辑:
对于新学生,计算EFF_Date那一天的数量和COST,再计算EFF_Date之前(包括)所有学生的数量和COST如下例子:如EFF_Date输入01-01-2008
ID 新学生总数 新学生COST 学生总数 总COST
1 2 30 2 30如EFF_Date输入01-02-2008
ID 新学生总数 新学生COST 学生总数 总COST
1 0 0 2 30
如EFF_Date输入02-01-2008
ID 新学生总数 新学生COST 学生总数 总COST
1 1 30 4 100EFF_Date输入02-02-2008
ID 新学生总数 新学生COST 学生总数 总COST
1 0 0 4 100如EFF_Date输入03-01-2008
ID 新学生总数 新学生COST 学生总数 总COST
1 0 0 5 150EFF_Date输入03-02-2008
ID 新学生总数 新学生COST 学生总数 总COST
1 0 0 5 150
ID 新学生总数 新学生COST 学生总数 总COST
1 1 30 4 100 ---- 明明02-01-2008有两位同学呀? 怎么在你例子中只有一位了? 还是跟StatusID也有关??
create proc wsp
@date datetime
as
select id,
新学生总数=(select count(1) from STU where eff_date=@date),
新学生COST=(select isnull(sum(Cost),0) from STU where eff_date=@date),
学生总数=(select count(1) from STU where eff_date<=@date),
总COST=(select sum(Cost) from STU where eff_date<=@date)
from STU a group by id
@EFF_Date datetime
as
declare @id int,@a int,@b int,@c int,@d int
set @id=1
select @a=count(*),@b=sum(COST)
from stu as a where statusid=100 and EFF_Date=@EFF_Date group by id
select @c=count(*) from stu where EFF_Date<=@EFF_Date
select @d=sum(cost) from stu where EFF_Date<=@EFF_Date
select @id as id,isnull(@a,0) as 新学生总数,isnull(@b,0) as 新学生COST,isnull(@c,0) as 学生总数,isnull(@d,0) as 总COSTp_selectstuinfo '01-01-2008'
p_selectstuinfo '01-02-2008'
p_selectstuinfo '02-01-2008'
p_selectstuinfo '02-02-2008'
p_selectstuinfo '03-01-2008'
p_selectstuinfo '03-02-2008'
insert into student select 1,1,100,'01-01-2008',10
insert into student select 1,2,100,'01-01-2008',20
insert into student select 1,3,100,'02-01-2008',30
insert into student select 1,4,101,'02-01-2008',40
insert into student select 1,5,102,'03-01-2008',50
create proc proc_student
@dt datetime
as
begin
select id,
sum(case when statusid=100 then 1 else 0 end) as '新学生总数',
sum(case when statusid=100 then cost else 0 end) as '新学生COST',
count(1) as 学生总数,
sum(cost) as 总COST
from student
where datediff(dd,eff_date,@dt)>=0
group by id
endexec proc_student '2008-02-01'id 新学生总数 新学生COST 学生总数 总COST
1 3 60 4 100
p_selectstuinfo '01-01-2008'
/*
1 2 30 2 30
*/
p_selectstuinfo '01-02-2008'
/*
1 0 0 2 30
*/
p_selectstuinfo '02-01-2008'
/*
1 1 30 4 100
*/
p_selectstuinfo '02-02-2008'
/*
1 0 0 4 100
*/
p_selectstuinfo '03-01-2008'
/*
1 0 0 5 150
*/
p_selectstuinfo '03-02-2008'
/*
1 0 0 5 150
*/
没搞懂前面那个id是什么意思。
create table STU(ID int,StuID int,StatusID int,EFF_Date datetime,Cost int)
insert into STU
select 1,1,100,'01-01-2008',10 union all
select 1,2,100,'01-01-2008',20 union all
select 1,3,100,'02-01-2008',30 union all
select 1,4,101,'02-01-2008',40 union all
select 1,5,102,'03-01-2008',50
gocreate proc wsp
@date datetime
as
select id,
新学生总数=(select count(1) from STU where eff_date=@date and statusid=100),
新学生COST=(select isnull(sum(Cost),0) from STU where eff_date=@date and statusid=100),
学生总数=(select count(1) from STU where eff_date<=@date),
总COST=(select sum(Cost) from STU where eff_date<=@date)
from STU a group by id
go--测试:
exec wsp '01-02-2008'
go
insert into student select 1,1,100,'01-01-2008',10
insert into student select 1,2,100,'01-01-2008',20
insert into student select 1,3,100,'02-01-2008',30
insert into student select 1,4,101,'02-01-2008',40
insert into student select 1,5,102,'03-01-2008',50
alter proc proc_student
@dt datetime
as
begin
select id,
sum(case when statusid=100 and datediff(dd,eff_date,@dt)=0 then 1 else 0 end) as '新学生总数',
sum(case when statusid=100 and datediff(dd,eff_date,@dt)=0 then cost else 0 end) as '新学生COST',
count(1) as 学生总数,
sum(cost) as 总COST
from student
where datediff(dd,eff_date,@dt)>=0
group by id
endexec proc_student '2008-02-02'id 新学生总数 新学生COST 学生总数 总COST
1 0 0 4 100这个靠谱了..
exec proc_student '01-02-2008'
exec proc_student '02-01-2008'
exec proc_student '02-02-2008'
exec proc_student '03-01-2008'
exec proc_student '03-02-2008'id 新学生总数 新学生COST 学生总数 总COST
1 2 30 2 30id 新学生总数 新学生COST 学生总数 总COST
1 0 0 2 30id 新学生总数 新学生COST 学生总数 总COST
1 1 30 4 100id 新学生总数 新学生COST 学生总数 总COST
1 0 0 4 100id 新学生总数 新学生COST 学生总数 总COST
1 0 0 5 150id 新学生总数 新学生COST 学生总数 总COST
1 0 0 5 150