小题号 学号 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%

解决方案 »

  1.   

    题乱了,重排一下看看,不知道这样行不行小题号 学号 1 2 3 4 5 6 7 8 9
    库中题号 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%
      

  2.   

    这要在程序里解答,它存在datatable里,4L 说有点眼晕?看第2个应该还好吧,我两天前也有个解决方案,但是有一个缺点,就是循环的次数太多了 有 x*y次 如果有100道题 ,一百个学生成绩,那得循环1W次,让人接受不了,本人在这里请求各位的支援
      

  3.   

    这只是一个文本缩进的事 ,应该能看清的,像学号,小题号等第一行是标题,整个数据结构存放在datatable里
      

  4.   

    如果数据结构清晰一些,可以这样:
    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 行受影响)
    */
      

  5.   

    我要在程序里实现
    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
      

  6.   

    折合成百分比的写法:
    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 行受影响)*/
      

  7.   

    说实话,我只能说您没搞明白基本的数据结构设计.
    如果每题1分,100道题,或者每题0.5分,200道题,您的那个列名怎么处理?
    您的实例数据,应该是从EXCEL里弄来的吧?
      

  8.   


        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();
                
            }
      

  9.   

    如果是在EXCEL里,也可以进行简单的处理的,比如就上面的数据,把它弄到EXCEL里(不含列名行),在L6单元格输入公式
    =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及以后的统计就不说了...
    有了各科总分,各科得分,一除就行了,不过在设置公式时要注意绝对单元格和相对单元格的问题,其实,熟练了,也很好弄的.
      

  10.   

    他并不在数据库里,列名是自动增长的  有200道题 自然就有200列,而且数据并不是来自数据库,可能来自SQL  也可能来 XML 所以我说要在程序里解决