小题号 学号 1 2 3 4 5 6 7 8 9 10
库中题号 813 1351 1326 1183 812 1114 1115 1119 1120 1121
所属章节 医学 法律 法律 财经 医学 医学 医学 医学 医学 医学
题型 单4选1 单4选1 单4选1 单4选1 单4选1 串4选1 串4选1 串4选1 串4选1 串4选1
正确答案 D D D B C A B D C D
满分(100) 3.5 4 4 4 4 4 4 3.5 3.5 4
1 s03 C C D E D B A C C D
2 s04 B D B B C D D D C D
3 s05 D D C B B D D D C D
4 s06 D D B D D A B D C D
5 s07 D D D B D D C C C B
要得到的统计结果:
得到该考生在各章节的得分比。举个例子,比如学生s03 ,医学有总分30分,他只得了3分,那他在医学这个章节的得分比是10%,这里我只给了部分数据,全部数据的总分(满分)是有100的。
最后的数据类似这样试卷分析--试卷分析结果(这是个例子,数据并不准确)
学号 得分 医学 法律 财经
s03 60 20% 30% 20%
s04 40 40% 40% 20%
s05 60 60% 70% 20%
库中题号 813 1351 1326 1183 812 1114 1115 1119 1120 1121
所属章节 医学 法律 法律 财经 医学 医学 医学 医学 医学 医学
题型 单4选1 单4选1 单4选1 单4选1 单4选1 串4选1 串4选1 串4选1 串4选1 串4选1
正确答案 D D D B C A B D C D
满分(100) 3.5 4 4 4 4 4 4 3.5 3.5 4
1 s03 C C D E D B A C C D
2 s04 B D B B C D D D C D
3 s05 D D C B B D D D C D
4 s06 D D B D D A B D C D
5 s07 D D D B D D C C C B
要得到的统计结果:
得到该考生在各章节的得分比。举个例子,比如学生s03 ,医学有总分30分,他只得了3分,那他在医学这个章节的得分比是10%,这里我只给了部分数据,全部数据的总分(满分)是有100的。
最后的数据类似这样试卷分析--试卷分析结果(这是个例子,数据并不准确)
学号 得分 医学 法律 财经
s03 60 20% 30% 20%
s04 40 40% 40% 20%
s05 60 60% 70% 20%
解决方案 »
- 来个小问题,请看
- 求一条SQL语句
- 关于调用sql2005自定义函数问题
- 这个update如何写?
- SQL 2008 按时间段划分(每十分钟)统计良率
- 100分求(省市县学校(大学和高中))的联动数据库(类似海内网,校内网的联动)!
- SQLServer存储过程中如何支持动态的SQL调用?
- 两个表中,查询到一条记录就返回继续下一条的查找,在这种情况下,如何提高Select的效率
- 我在SQLSERVER管理器中建了一个作业,并定为每月第二天零点执行。可是这个作业只在上月执行成功,这个月一执行就失败这是为何?
- 关于数据库恢复问题
- SQL 关于下一记录的时间等于上一条记录的时间加上上一个记录保持的秒数
- 错误
库中题号 813 1351 1326 1183 812 1114 1115 1119 1120
所属章节 医学 法律 法律 财经 医学 医学 医学 医学 医学
题型 单4选1 单4选1 单4选1 单4选1 单4选1 串4选1 串4选1 串4选1 串4选1
正确答案 D D D B C A B D C
满分(100) 3.5 4 4 4 4 4 4 3.5 3.5
1 s03 C C D E D B A C C
2 s04 B D B B C D D D C
3 s05 D D C B B D D D C
4 s06 D D B D D A B D C
5 s07 D D D B D D C C C要得到的统计结果:
得到该考生在各章节的得分比。举个例子,比如学生s03 ,医学有总分30分,他只得了3分,那他在医学这个章节的得分比是10%,这里我只给了部分数据,全部数据的总分(满分)是有100的。
最后的数据类似这样试卷分析--试卷分析结果(这是个例子,数据并不准确)
学号 得分 医学 法律 财经
s03 60 20% 30% 20%
s04 40 40% 40% 20%
s05 60 60% 70% 20%
create table 题目(题号 int,库中题号 int,所属章节 nvarchar(10),题型 nvarchar(10),正确答案 varchar(10),满分 decimal(5,1))
insert into 题目 select 1,813,'医学','4选1','D',3.5
insert into 题目 select 2,1351,'法律','4选1','D',4
insert into 题目 select 3,1326,'法律','4选1','D',4
insert into 题目 select 3,1183,'财经','4选1','B',4
create table 答题(学号 nvarchar(10),题号 int,答案 varchar(10))
insert into 答题 select 's03',1,'C'
insert into 答题 select 's03',2,'C'
insert into 答题 select 's03',3,'D'
insert into 答题 select 's04',1,'B'
insert into 答题 select 's04',2,'D'
insert into 答题 select 's04',3,'B'go
--select 学号,所属章节,
--
;with c1 as(
select b.学号,a.所属章节,sum(case when b.答案=a.正确答案 then a.满分 else 0 end)得分
from 题目 a inner join 答题 b on a.题号=b.题号 group by b.学号,a.所属章节
),c2 as(
select 学号,sum(得分)总分 from c1 group by 学号
),c3 as(
select 学号,所属章节,sum(得分)章节得分 from c1 group by 学号,所属章节
),c4 as(
select 所属章节,sum(满分)章节总分 from 题目 group by 所属章节
),c5 as(
select a.学号,a.所属章节,a.章节得分/b.章节总分 章节得分率 from c3 a inner join c4 b on a.所属章节=b.所属章节
),c6 as(
select 学号,[财经],[法律],[医学] from c5
pivot (max([章节得分率]) for 所属章节 in([财经],[法律],[医学]))b
)select a.学号,总分,财经,法律,医学 from c2 a inner join c6 b on a.学号=b.学号
go
drop table 题目,答题
/*
学号 总分 财经 法律 医学
---------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
s03 4.0 0.000000 0.500000 0.000000
s04 8.0 1.000000 0.500000 0.000000(2 行受影响)
*/
create table AnalyseTable
(
xiaotihao nvarchar(50),
xuehao nvarchar(50),
a nvarchar(50),
b nvarchar(50),
c nvarchar(50),
d nvarchar(50),
e nvarchar(50),
f nvarchar(50),
g nvarchar(50),
h nvarchar(50),
j nvarchar(50)
)insert into AnalyseTable values('库中题号','','813','1351','1326','1183','812','1114','1115','1119','1120')
insert into AnalyseTable values('所属章节','','医学','法律','法律','财经','医学','医学','医学','医学','医学')
insert into AnalyseTable values('题型','','单4选1','单4选1','单4选1','单4选1','单4选1','串4选1','串4选1','串4选1','串4选1')
insert into AnalyseTable values('正确答案','','D','D','D','B','C','A','B','D','C')
insert into AnalyseTable values('满分','','3.5','4','4','4','4','4','4','3.5','3.5')insert into AnalyseTable values('1','S03','C','C','D','E','D','B','A','C','C')
insert into AnalyseTable values('1','S04','B','D','B','B','C','D','D','D','C')
insert into AnalyseTable values('1','S05','D','D','C','B','B','D','D','D','C')
insert into AnalyseTable values('1','S06','D','D','B','D','D','A','B','D','C')
insert into AnalyseTable values('1','S07','D','D','D','B','D','D','C','C','C')select * from AnalyseTable
create table 题目(题号 int,库中题号 int,所属章节 nvarchar(10),题型 nvarchar(10),正确答案 varchar(10),满分 decimal(5,1))
insert into 题目 select 1,813,'医学','4选1','D',3.5
insert into 题目 select 2,1351,'法律','4选1','D',4
insert into 题目 select 3,1326,'法律','4选1','D',4
insert into 题目 select 3,1183,'财经','4选1','B',4
create table 答题(学号 nvarchar(10),题号 int,答案 varchar(10))
insert into 答题 select 's03',1,'C'
insert into 答题 select 's03',2,'C'
insert into 答题 select 's03',3,'D'
insert into 答题 select 's04',1,'B'
insert into 答题 select 's04',2,'D'
insert into 答题 select 's04',3,'B'
go
;with c1 as(
select b.学号,a.所属章节,sum(case when b.答案=a.正确答案 then a.满分 else 0 end)得分
from 题目 a inner join 答题 b on a.题号=b.题号 group by b.学号,a.所属章节
),c2 as(
select 学号,sum(得分)总分 from c1 group by 学号
),c3 as(
select 学号,所属章节,sum(得分)章节得分 from c1 group by 学号,所属章节
),c4 as(
select 所属章节,sum(满分)章节总分 from 题目 group by 所属章节
),c5 as(
select a.学号,a.所属章节,ltrim(convert(int,a.章节得分/b.章节总分*100))+'%' 章节得分率
from c3 a inner join c4 b on a.所属章节=b.所属章节
),c6 as(
select 学号,[财经],[法律],[医学] from c5
pivot (max([章节得分率]) for 所属章节 in([财经],[法律],[医学]))b
)select a.学号,总分,财经,法律,医学 from c2 a inner join c6 b on a.学号=b.学号
go
drop table 题目,答题
/*
学号 总分 财经 法律 医学
---------- --------------------------------------- ------------- ------------- -------------
s03 4.0 0% 50% 0%
s04 8.0 100% 50% 0%(2 行受影响)*/
如果每题1分,100道题,或者每题0.5分,200道题,您的那个列名怎么处理?
您的实例数据,应该是从EXCEL里弄来的吧?
class Program
{
public static string[][] GetStudentAnswer()
{
string[][] str = new string[3][];
str[0] = new string[5] {"s03","C","C","D","E","D"};
str[1] = new string[5] {"s04", "C", "C", "D", "E", "D"};
str[2] = new string[5] {"s05", "C", "C", "D", "E", "D"};
return str;
}
public static string[][] GetStanandInfo()
{
string[][] str=new string[5][];
str[0] = new string[5] { "1", "183", "医学", "单四选一", "D","3.5"};
str[1] = new string[5] { "2", "184", "法律", "单四选一", "B","4"};
str[2] = new string[5] { "3", "185", "财经", "单四选一", "C","5" };
str[3] = new string[5] { "4", "186", "医学", "单四选一", "A","3" };
str[4] = new string[5] { "5", "187", "财经", "单四选一", "D","3"};
return str;
}
static void Main(string[] args)
{
double[,] sumOne=new double[3,3];
double[,] sumTwo=new double[3,3];
double[,] sumThree=new double[3,3];
string[][] standard=GetStanandInfo();
string[][] answer = GetStudentAnswer();
for (int i = 0; i < standard.GetLength(1);i++)
for(int j=0;j<answer.GetLength(0);j++)
{
if (standard[4][i] == answer[j][i + 1])
{
answer[j][i + 1] = standard[5][j];
}
else
{
answer[j][i + 1] = "0";
}
}
for (int i = 0; i < standard.GetLength(1);i++)
for (int j = 0; j < answer.GetLength(0); j++)
{
if (standard[2][i] == "医学")
{
sumOne[j, 0] += Convert.ToDouble(answer[j][i + 1]);
}
if (standard[2][i] == "法律")
{
sumOne[j, 1] += Convert.ToDouble(answer[j][i + 1]);
}
if (standard[2][i] == "财经")
{
sumOne[j, 2] += Convert.ToDouble(answer[j][i + 1]);
}
}
Console.ReadKey();
}
=IF(C6=C$4,VALUE(C$5),0)
向右拉9格,则该生9题的成绩都有了,再选中这9格,向下拉全部学生,那成绩都有了.
在U6单元格求总分
=SUM(L6:T6)
在V6单元格开始统计医学分
=IF(C$2="医学",L6,0)
拉向右共9格,在AE6单元格求医学总分
=SUM(V6:AD6)
在AF6单元格开始统计法律分
=IF(C$2="法律",L6,0)
在AO6单元格统计法律总分
=SUM(AF6:AN6)
在AP6单元格及以后9格统计财经得分
=IF(C$2="财经",L6,0)
在AY6求财经总分
=SUM(AP6:AX6)
对了,还要分别统计各科总成绩,在V5做
=IF(C$2="医学",VALUE(C5),0)
并在AE5统计,AF5及以后的统计就不说了...
有了各科总分,各科得分,一除就行了,不过在设置公式时要注意绝对单元格和相对单元格的问题,其实,熟练了,也很好弄的.