存储过程中创建临时表的问题。

lzol 2004-08-25 10:10:37
我想做一个这样的东西,举个例子说好点,比如有几个班级,选出每个班每个学生的几门课的考试分数,然后列出来,每个班级添加一个合计行,计算各科成绩的总分。怎么用存储过程实现?存储过程要几个参数,比如日期型,统计成绩的开始和结束日期,还有班级名称,用来查询某个班级的成绩。请高手指教!
...全文
426 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzol 2004-08-27
  • 打赏
  • 举报
回复
邹大哥真厉害,问题解决了,散分!
zjcxc 2004-08-26
  • 打赏
  • 举报
回复
--示例数据
CREATE TABLE [dbo].[student] (
[xh] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[bj] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[xm] [char] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
insert student select 1,1,'张三'
union all select 2,1,'李四'
union all select 1,2,'王五'
GO

CREATE TABLE [dbo].[cj] (
[xh] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[bj] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[km] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[cj] [float] NULL ,
[begindate] [datetime] NULL ,
[enddate] [datetime] NULL
) ON [PRIMARY]
insert cj select 1,1,'语文',93,'2003-1-1','2003-11-1'
union all select 1,1,'数学',92,'2003-1-1','2003-11-1'
union all select 1,2,'语文',90,'2003-1-1','2003-11-1'
union all select 1,2,'数学',97,'2003-1-1','2003-11-1'
union all select 2,1,'语文',95,'2003-1-1','2003-11-1'
union all select 2,1,'数学',80,'2003-1-1','2003-11-1'
GO

CREATE TABLE [dbo].[bj] (
[bjbh] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[bjmc] [char] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
insert bj select 1,'1班'
union all select 2,'2班'
GO

--查询的存储过程
create proc p_qry
@begindate datetime,
@enddate datetime
as
select 班级=case
when grouping(a.bjmc)=1
then '总计'
when grouping(b.xh)=1
then '合计'
else a.bjmc end
,学号=isnull(cast(b.xh as varchar),'')
,姓名=isnull(b.xm,'')
,语文=cast(sum(case c.km when '语文' then cj else 0 end) as decimal(10,2))
,数学=cast(sum(case c.km when '数学' then cj else 0 end) as decimal(10,2))
from bj a,student b,cj c
where a.bjbh=b.bj
and a.bjbh=c.bj
and b.xh=c.xh
and c.begindate>=@begindate
and c.enddate<=@enddate
group by a.bjmc,b.xh,b.xm with rollup
having grouping(b.xm)=0
or grouping(a.bjmc)=1
or grouping(b.xh)=1
go

--调用
exec p_qry '2003-1-1','2003-11-1'
go

--删除测试
drop table cj,bj,student
drop proc p_qry

/*--测试结果

班级 学号 姓名 语文 数学
---------- ------ --------- ----------- ----------
1班 1 张三 93.00 92.00
1班 2 李四 95.00 80.00
合计 188.00 172.00
2班 1 王五 90.00 97.00
合计 90.00 97.00
总计 278.00 269.00

(所影响的行数为 6 行)
--*/
lzol 2004-08-26
  • 打赏
  • 举报
回复
tigerjacky(林石) 大哥,多谢了,我试试用别的方法做吧。
tigerjacky 2004-08-26
  • 打赏
  • 举报
回复
如果是.NET 你可以用在DATATABLE中操作.把两个数据集合返回的数据拼凑成一个DATATABLE在赋值给DATAGRID ,为什么会想到用存储过程?
lzol 2004-08-26
  • 打赏
  • 举报
回复
学生信息表
CREATE TABLE [dbo].[student] (
[xh] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[bj] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[xm] [char] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
成绩表
CREATE TABLE [dbo].[cj] (
[xh] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[bj] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[km] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[cj] [float] NULL ,
[begindate] [datetime] NULL ,
[enddate] [datetime] NULL
) ON [PRIMARY]
GO
班级表
CREATE TABLE [dbo].[bj] (
[bjbh] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[bjmc] [char] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
想要的结果
班级 学号 姓名 语文 数学 
1班  1  张三 93  92
1班  2  李四 90  97
...........................
合计 321 323
2班 1 王五 95 80
...........................
...........................
...........................
lzol 2004-08-25
  • 打赏
  • 举报
回复
哦,好的。简单点吧,三个表,一个存储学生信息,包括学号,班级,姓名;一个表存储成绩,包括学号,班级,科目,成绩,学期起始日期,学期终止日期;另一个表存储班级信息,包括班级名称,班级代号。不知道这样写行吗?请邹大哥多帮忙。另外我想把它绑定到DataGrid,应该怎么绑呀?
zjcxc 2004-08-25
  • 打赏
  • 举报
回复
写出表结构,举数据说明.

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧