数据表如下: A表
姓名 科目 分数
==========================================================
小明 语文 88
小明 数学 90
小花 英语 60
小明 英语 78
小花 语文 89
小春 数学 100
小春 英语 95现在我想求出:
1。每个学生的总分数/表的总分数
小明 (88+90+78)/表里总分
小花 (60+89)/表里总分
小春 (100+95)/表里总分
2。各科总分数/表总分数
语文 (88+89)/表里总分
数学 (90+100)/表里总分
英语 (60+78+95)/表里总分在线等待高手做答,谢谢
实在是没什么分了,CSDN的分比钱还难赚。见谅。。
姓名 科目 分数
==========================================================
小明 语文 88
小明 数学 90
小花 英语 60
小明 英语 78
小花 语文 89
小春 数学 100
小春 英语 95现在我想求出:
1。每个学生的总分数/表的总分数
小明 (88+90+78)/表里总分
小花 (60+89)/表里总分
小春 (100+95)/表里总分
2。各科总分数/表总分数
语文 (88+89)/表里总分
数学 (90+100)/表里总分
英语 (60+78+95)/表里总分在线等待高手做答,谢谢
实在是没什么分了,CSDN的分比钱还难赚。见谅。。
解决方案 »
- SQL2005 如何在游标定义中引入参数?
- 新手请教:有关sql查询输出语句、
- 如何把SQL 2000中以二进制形式存储的图片批量保存到文件夹中去
- 事务并发访问
- sql server 2000 与sql server 2005 是不是不能同时按装在一台机器上
- 如何得到动态执行的SQL语句的中某个变量的返回值?
- 菜鸟问大虾:在SQL SERVER中怎样在建表时,可以把一个字段的值赋给另外一个字段初值,而且又可以修改值吗?如果可以请问怎样实现?
- 急~~~~~在线等待。。求一复杂SQL语句。。。
- 再谈sql server2000的安装问题,是新情况!各位看一下!
- 求教简单的Sql语法。在线等,实在没分了。。。
- 数据库设计
- SQL语句 数据统计
小明 (88+90+78)/表里总分
小花 (60+89)/表里总分
小春 (100+95)/表里总分select 姓名 , sum(分数*1.0) / (select sum(分数) from a) from a group by 姓名
2。各科总分数/表总分数
语文 (88+89)/表里总分
数学 (90+100)/表里总分
英语 (60+78+95)/表里总分select 科目 , sum(分数*1.0) / (select sum(分数) from a) from a group by 科目
直接
select 姓名,sum(分数) as 分数 from tb group by 姓名select 科目,sum(分数) as 分数 from tb group by 科目
select 姓名,sum(分数)/(select sum(分数) from tb) as 分数 from tb group by 姓名select 科目,sum(分数)/(select sum(分数) from tb) as 分数 from tb group by 科目
insert into a values('小明', '语文' ,88)
insert into a values('小明', '数学' ,90)
insert into a values('小花', '英语' ,60)
insert into a values('小明', '英语' ,78)
insert into a values('小花', '语文' ,89)
insert into a values('小春', '数学' ,100)
insert into a values('小春', '英语' ,95)
goselect 姓名 , sum(分数*1.0) / (select sum(分数) from a) from a group by 姓名
/*
姓名
---------- ----------------------------------------
小春 .325000
小花 .248333
小明 .426666(所影响的行数为 3 行)
*/select 科目 , sum(分数*1.0) / (select sum(分数) from a) from a group by 科目
/*
科目
---------- ----------------------------------------
数学 .316666
英语 .388333
语文 .295000(所影响的行数为 3 行)*/drop table a
insert #tb1 select '小明','语文',88
insert #tb1 select '小明','数学', 90
insert #tb1 select '小花','英语', 60
insert #tb1 select '小明','英语', 78
insert #tb1 select '小花','语文', 89
insert #tb1 select '小春','数学', 100
insert #tb1 select '小春','英语', 95
select distinct 姓名,cast(sum(分数) over(partition by 姓名)*1.0/sum(分数) over() as decimal(9,2)) from #tb1select distinct 科目,cast(sum(分数) over(partition by 科目)*1.0/sum(分数) over() as decimal(9,2)) from #tb1姓名
---------- ---------------------------------------
小春 0.33
小花 0.25
小明 0.43(3 行受影响)科目
---------- ---------------------------------------
数学 0.32
英语 0.39
语文 0.30(3 行受影响)
在这地方没上面几楼的效率高。
如果我要算出各个同学的单科成绩 与 他们各自的总分比呢
就是首先要group by 姓名,然后再用over函数
insert into a values('小明', '语文' ,88)
insert into a values('小明', '数学' ,90)
insert into a values('小花', '英语' ,60)
insert into a values('小明', '英语' ,78)
insert into a values('小花', '语文' ,89)
insert into a values('小春', '数学' ,100)
insert into a values('小春', '英语' ,95)
goselect t.* , t.分数*1.0 / (select sum(分数) from a where 姓名 = t.姓名 ) from a tdrop table a/*
姓名 科目 分数
---------- ---------- ----------- --------------------------
小明 语文 88 .343750000000
小明 数学 90 .351562500000
小花 英语 60 .402684563758
小明 英语 78 .304687500000
小花 语文 89 .597315436241
小春 数学 100 .512820512820
小春 英语 95 .487179487179(所影响的行数为 7 行)*/