存储过程,高分求解!!!(100分)

  • 主题发起人 xhyuanxhyuan
  • 开始时间
X

xhyuanxhyuan

Unregistered / Unconfirmed
GUEST, unregistred user!
表1: id test 表2: id stu_id s(分数)
1 语文 1 t1 43
2 数学 1 t2 67
3 英语 2 t1 80
2 t2 90
3 t1 68
3 t2 97
要求得到结果集:
stu_id 语文 数学 英语 总分 名次
t1 43 80 68 -- --
t2 67 90 97 -- --


因为我希望能根据考试动态总结成绩,所以id最好能通过参数传入
大家帮忙看看有什么好的解决办法

高分求改,分不够开帖再加,
 
可以这样写不:
Create Procedure SList(
@Id As nvarchar(20)--传入的科目,参数格式为"1,2"
)
Begin Transcation
Select T1.Test,T2.* From 表二 T2,表一 T1 Where T2.id In (@Id) And T1.ID=T2.ID Order By stu_id
Commit Transcation
go
 
不行啊,结果集应该是要以stu_id为键
 
把每门课的的成绩生成表,再将这些表以Stu_id 来 JOIN 不就行了吗?
 
用游标了,不过我没有时间写代码了,只告诉你思路吧。
先创建临时表 TMP(stu_id 总分 名次)
插入TMP记录 select distinct stu_id from 表2
定义 根据表1 游标,
修改TMP表结构,Update TMP相应的时段值
结束游标。
再统计总分 名次
说得够详细了吧

 
建个临时表的方法比较好,join速度太慢了

谢谢各位!!!
 
快下班了,我来写一段吧:
create proc sumtest
as
--建一临时表
select distinct stu_id into #tmp

----------------------------------------------------------------
--用一游标插入stu_id,把所有的Stu_ID生成一表
--并成本汇总语句
--把所有的分数插入生成的表中
-----------------------------------------------------------------------------------
DECLARE @TMP VARCHAR(10) --test 的内容 如语文
DECLARE @GROUPSQL VARCHAR(255) --要生成的Group by的语句
DECLARE @SUMSQL VARCHAR(255) --要生成的汇总sum的语句
SELECT @GROUPSQL='',@SUMSQL=''
DECLARE MyCUR CURSOR FOR
SELECT DISTINCT 选定科目 from 选定科目表  
/*--这个‘选定科目表’也是在一个实在的用用于存放你从

表1: id test
1 语文
2 数学
3 英语
选中的test字段的表 ,要在前台完成

*/                        

OPEN MyCUR
FETCH NEXT FROM MCUR INTO @TMP
WHILE @@FETCH_STATUS=0
BEGIN
EXECUTE('ALTER TABLE #TMP ADD ['+ @TMP+'] int NULL')
--生成汇总语句
SET @SUMSQL=@SUMSQL+'SUM(['+@TMP+']),'
SET @GROUPSQL=@GROUPSQL+'['+@TMP+'],'
FETCH NEXT FROM MCUR INTO @TMP
END
--把后面的逗号去掉
SET @GROUPSQL=LEFT(@GROUPSQL,DATALENGTH(@GROUPSQL)-1)
SET @SUMSQL=LEFT(@SUMSQL,DATALENGTH(@SUMSQL)-1)
--下面是插入到一监时表中,以在打报表进分类汇总
ALTER TABLE #TMP ADD 总分 int
ALTER TABLE #TMP ADD 名次 int
--已生成了象这样的表格
--stu_id 语文 数学 英语 总分 名次
CLOSE MyCUR
DEALLOCATE MyCUR
--哎呀下班了, 再说分也少了点,以后也没有多少事了,就你自己搞定吧!
 
用什么游标,看看下面这段,也许有用:
rop proc getlist
go
create proc getlist @idlist varchar(100) as
/***************************
@idlist : 课程列表参数,
格式为:‘1,2,3’
***************************/

declare @strSQL1 varchar(5000), @strSQL2 varchar(5000), @colname varchar(50)
declare @i int,@j char

create table #temp(stu_id varchar(5))

set @strSQL1 = ''
set @strSQL2 = ''
set @i = 1
while @i<=len(@idlist)
begin
set @j = substring(@idlist,@i,1)
if @j <> ','
begin
set @strSQL1 = @strSQL1 + ' sum(case table1.id when ' + @j + ' then table2.s else 0 end) as f' + @j +', '
select @colname=test from table1 where id=@j
set @strSQL2 = @strSQL2 + @colname + ' decimal(5,2),'
end
set @i = @i + 1
end

set @strSQL1 = left(@strSQL1, len(@strSQL1)-1)
set @strSQL2 = 'alter table #temp add ' + @strSQL2 + '合计 decimal(7,2), 名次 int identity'

exec(@strSQL2)

set @strSQL1 = 'insert #temp select t1.* , t2.ff2 from
(select table2.stu_id,' + @strSQL1 + ' from table1,table2 where table1.id=table2.id group by table2.stu_id) as t1,
(select table2.stu_id, sum(table2.s) as ff2 from table2 group by table2.stu_id) as t2
where t1.stu_id=t2.stu_id order by t2.ff2 desc'

exec(@strSQL1)

select * from #temp order by stu_id
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
771
DelphiTeacher的专栏
D
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
954
SUNSTONE的Delphi笔记
S
顶部