交叉表应用-成绩统计

统计

最近由于开发需要,涉及到了成绩统计这块,这里面设计到了sql交叉表的应用,试了试,觉得很有感想,现在写出来大家看看,有什么不对的欢迎指正^_^

首先我们建立如下的表:

sc(成绩表)
stuid clsid scroe
----- -------- -----------------------------------------------------
0101 1 75.0
0102 1 70.0
0103 1 90.0
0101 2 89.0
0102 2 80.0
0103 2 99.0
0101 3 89.0
0102 3 79.0
0103 3 67.0

其中stuid表示学生编号,clsid表示课程编号,scroe表示成绩

stu(学生表)
stuid stuname
----------- --------------------------------------------------
101 张三
102 李四
103 王五

cls(课程表)
clsid name
----------- --------------------------------------------------
1 语文
2 数学
3 英语

接下来就是关键了,其实也不算好复杂,就是用到了动态sql

declare @sql nvarchar(4000),@sql1 nvarchar(4000)
select @sql='',@sql1=''

select @sql=@sql+',['+name+']=sum(case clsid when '''+clsid+''' then scroe else 0 end)',
@sql1=@sql1+',['+name+'名次]=(select sum(1) from # where ['+name+']>=a.['+name+'])'
from(select distinct b.clsid,c.name from sc as b inner join cls as c on c.clsid=b.clsid) as a order by clsid

exec('select stuid 学号'+@sql+',总成绩=sum(scroe)
,平均分=Convert(dec(5,1),avg(scroe)),总名次=(select sum(1) from(select stuid,aa=sum(scroe) from sc group by stuid) aa where sum(a.scroe)<=aa) into # from sc as a group by stuid select b.stuname as 姓名,a.*'+@sql1+' from # as a inner join stu as b on a.学号=b.stuid')

以下就是结果:

姓名 学号 语文 数学 英语 总成绩 平均分 总名次 语文名次 数学名次 英语名次
---------------------------------------------------- --------------------------------------
张三 0101 75.0 89.0 89.0 253.0 84.3 2 2 2 1
李四 0102 70.0 80.0 79.0 229.0 76.3 3 3 3 2
王五 0103 90.0 99.0 67.0 256.0 85.3 1 1 1 3

这就是交叉表的用法,对于报表统计很有用处,我们可以依此类推写出功能更强大的查询。

时间: 2024-12-01 19:43:44

交叉表应用-成绩统计的相关文章

Mysql5 实现交叉表查询

交叉表.行列转换和交叉查询经典 一.什么是交叉表 "交叉表"对象是一个网格,用来根据指定的条件返回值.数据显示在压缩行和列中.这种格式易于比较数据并辨别其趋势.它由三个元素组成: 行 列 摘要字段 "交叉表"中的行沿水平方向延伸(从一侧到另一侧).在上面的示例中,"手套"(Gloves) 是一行. "交叉表"中的列沿垂直方向延伸(上下).在上面的示例中,"美国"(USA) 是一列. 汇总字段位于行和列的交叉

Oracle动态交叉表生成_oracle

正在看的ORACLE教程是:Oracle动态交叉表生成.Oracle是应用最广的大型数据库,而在范式下进行Oracle数据库设计则可以大大减少数据冗余,使数据库维护更方便,可惜范式下的数据表一般不能直接输出.今天我们就来探讨一下范式下的数据表的动态交叉表生成的方法. 范式下的Oracle数据库设计 数据关系的复杂性导致了表中数据冗余的存在,数据冗余增加了维护数据库的负担,也占用了大量的磁盘空间,直接造成性能下降.为了消除这些负面影响,就应该对数据库表格进行规范化,使其遵守一定的规则的,尤其是数据

生成交叉表的简单通用存储过程

存储过程 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_qry]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)drop procedure [dbo].[p_qry]GO /*--生成交叉表的简单通用存储过程  根据指定的表名,纵横字段,统计字段,自动生成交叉表 并可根据需要生成纵横两个方向的合计  注意,横向字段数目如果大于纵向字段数目,将自动交换纵横

巧用Excel帮我进行学生成绩统计

在老师的日常工作中,对学生的成绩进行统计分析管理是一项非常重要也是十分麻烦的工作,如果能够利用EXCEL强大的数据处理功能,就可以让各位老师迅速完成对学生的成绩的各项分析统计工作.下面就向各位朋友介绍一些利用EXCEL进行学生成绩管理的小技巧. 一.快速转换学生考试成绩等级 有的时候,会遇到要将学生的考试成绩按实际考试分数转换成相应成绩等级的情况,如将考试成绩在90分以上的成绩转换成"A+"形式,85-89分的成绩转换成"A"形式....一般情况,在EXCEL表格中

SQL实现动态交叉表

动态交叉表就是列表可以根据表中数据的情况动态创建列. 动态查询不能使用Select语句实现,它可以利用存储过程实现.思路是: 首先检索列头信息,形成一个游标,然后遍历游标,将上面静态交叉表实现过程中使用Case语句判断的内容用游标里的值替代,形成一条新的Sql查询语句,然后执行并返回结果.下面是一个通用的实现动态交叉表的存储过程: CREATE procedure proc_across_table @TableName as varchar(50), --生成交叉表依据的表名 @NewColu

SUMIF、COUNTIF和SUMPRODUCT函数在成绩统计中的应用

在学校组织的学年考试考务工作中,为了便于评卷实行流水作业和避免学生作弊,经常将同一年级不同班级的学生拆散混编.在考试登分完毕之后,如何做到不改变原始表格的状态而进行分班成绩统计呢?利用SUMIF.COUNTIF和SUMPRODUCT这三个函数,一切都将会变得十分轻松.下面举例说明. 一.造册登分 登分册一般有班级.考号.姓名及语文.数学等学科名称,我们可以把这个工作表建立在Sheet1,并将其重命名为"登分册",将学生成绩输入其中(见图一).将Sheet2命名为"统计表&qu

WPS表格技巧:对象数不确定的成绩统计

评比活动中为了更好地体现公正.公平.公开,组织者往往在现场设定多个评定内容.临时邀请多个评委专家,当场打分当场公布.利用WPS表格,能高效准确地完成这类统计对象数不确定的成绩统计任务. 基本思路 多个评委多个评定内容,属于评委数量不确定.评定内容数量不确定的命题,解决的基本思路是把评委数量等不确定的值转化为确定值来处理. 评分要求 多个评委对多项内容分别打分.评分中去掉一个最高分.一个最低分后求平均,所得结果作为得分;评定内容按相同权重进行汇总,所得结果为项目总得分.按总得分排出名次.以合唱比赛

一个交叉表

一个交叉表.用字段明做为值:原表数据为: 字段1    字段2    字段3  A1            B1            C1  A2            B2            C2变换后:COL1          COL2         COL3字段1            A1                A2字段2            B1                B2字段3            C1                C2 create

SQL交叉表实例

版权声明:CSDN是本Blog托管服务提供商.如本文牵涉版权问题,CSDN不承担相关责任,请版权拥有者直接与文章作者联系解决. SQL交叉表实例 很简单的一个东西,见网上好多朋友问"怎么实现交叉表?",以下是我写的一个例子,数据库基于SQL SERVER 2000. -- ====================================================== --交叉表实例 -- ==========================================