一个数据统计算问题,请前辈指点!!先感谢前辈哈!!
表结构
表名:学生名册
学号 姓名 班级
20050001 张三 1班
20050002 李四 2班
表名:学生缴费
学号 缴费金额 学期
20050001 500 2006-2007-2
20050001 400 2006-2007-1
20050002 300 2006-2007-2
表名:学生领书
学号 教材名称 单价 学期
20050001 软件工程 25 2006-2007-2
20050001 photoshop教程 35 2006-2007-2
20050002 coreldraw教程 30 2006-2007-1
20050001 coreldraw教程 30 2006-2007-1
实现目标:
想按学期给学生结算费用,想达到下面这种格式(这是我想的格式,其它的也可以哈)?小弟万分感激!!
表名:学生退费
学号 学期 缴纳 支出 退费
20050001 2006-2007-1 400 30 370
20050001 2006-2007-2 500 60 440
[解决办法]
select 学号,学期,sum(isnull(缴费金额,0)) 缴费,sum(isnull(单价,0)) 支出,sum(isnull(缴费金额,0))-sum(isnull(单价,0)) 退费 from 学生缴费 a left join 学生领书 b on a.学号=b.学号 and a.学期=b.学期 group by a.学号,a.学期,b.学号,b.学期
[解决办法]
select a.学号,b.学期,缴纳=b.缴费金额,支出=sum(c.单价),退费=b.缴费金额-sum(c.单价)
from 学生名册 a
left join 学生缴费 b
on a.学号=b.学号
left join 学生领书 c
on b.学号=c.学号 and b.学期=c.学期
group by a.学号,b.学期,b.缴费金额
[解决办法]
--原始数据:@学生名册
declare @学生名册 table(学号 int,姓名 varchar(4),班级 varchar(4))
insert @学生名册
select 20050001, '张三 ', '1班 ' union all
select 20050002, '李四 ', '2班 '
--原始数据:@学生缴费
declare @学生缴费 table(学号 int,缴费金额 int,学期 varchar(12))
insert @学生缴费
select 20050001,500, '2006-2007-2 ' union all
select 20050001,400, '2006-2007-1 ' union all
select 20050002,300, '2006-2007-2 '
--原始数据:@学生领书
declare @学生领书 table(学号 int,教材名称 varchar(13),单价 int,学期 varchar(12))
insert @学生领书
select 20050001, '软件工程 ',25, '2006-2007-2 ' union all
select 20050001, 'photoshop教程 ',35, '2006-2007-2 ' union all
select 20050002, 'coreldraw教程 ',30, '2006-2007-1 ' union all
select 20050001, 'coreldraw教程 ',30, '2006-2007-1 '
select a.学号,b.学期,缴纳=b.缴费金额,支出=sum(c.单价),退费=b.缴费金额-sum(c.单价)
from @学生名册 a
left join @学生缴费 b
on a.学号=b.学号
left join @学生领书 c
on b.学号=c.学号 and b.学期=c.学期
group by a.学号,b.学期,b.缴费金额
/*
学号学期缴纳支出退费
200500012006-2007-1 40030370
200500012006-2007-2 50060440
200500022006-2007-2 300NULLNULL
*/
[解决办法]
--为以防学生没有支出,使用left join
select t1.* , isnull(t2.支出,0) 支出 , t1.缴纳 - isnull(t2.支出,0) 退费 from
(select 学号 , 学期 , sum(缴费金额) 缴纳 from 学生缴费 group by 学号 , 学期) t1
left join (select 学号 , 学期 , sum(单价) 支出 from 学生领书 group by 学号 , 学期) t2
on t1.学号 = t2.学号 and t1.学期 = t2.学期
[解决办法]
--由于你的数据有误,使用全连接.
create table 学生名册(学号 varchar(10),姓名 varchar(10),班级 varchar(10))
insert into 学生名册 values( '20050001 ', '张三 ', '1班 ')
insert into 学生名册 values( '20050002 ', '李四 ', '2班 ')
create table 学生缴费(学号 varchar(10),缴费金额 int, 学期 varchar(20))
insert into 学生缴费 values( '20050001 ', 500, '2006-2007-2 ')
insert into 学生缴费 values( '20050001 ', 400, '2006-2007-1 ')
insert into 学生缴费 values( '20050002 ', 300, '2006-2007-2 ')
create table 学生领书(学号 varchar(10),教材名称 varchar(20),单价 int,学期 varchar(20))
insert into 学生领书 values( '20050001 ', '软件工程 ' , 25, '2006-2007-2 ')
insert into 学生领书 values( '20050001 ', 'photoshop教程 ', 35, '2006-2007-2 ')
insert into 学生领书 values( '20050002 ', 'coreldraw教程 ', 30, '2006-2007-1 ')
go
select isnull(t1.学号,t2.学号) 学号, isnull(t1.学期,t2.学期) 学号, isnull(t1.缴纳,0) 缴纳 , isnull(t2.支出,0) 支出 , isnull(t1.缴纳,0) - isnull(t2.支出,0) 退费 from
(select 学号 , 学期 , sum(缴费金额) 缴纳 from 学生缴费 group by 学号 , 学期) t1
full join (select 学号 , 学期 , sum(单价) 支出 from 学生领书 group by 学号 , 学期) t2
on t1.学号 = t2.学号 and t1.学期 = t2.学期
drop table 学生名册,学生缴费,学生领书
/*
学号 学号 缴纳 支出 退费
---------- -------------------- ----------- ----------- -----------
20050001 2006-2007-1 400 0 400
20050001 2006-2007-2 500 60 440
20050002 2006-2007-1 0 30 -30
20050002 2006-2007-2 300 0 300
(所影响的行数为 4 行)
*/