一份试卷,共5道题(包含单选和多选) 
存试卷答案表如下: 
表:kst; 
字段:student_id(学生ID) ,testpaper_id(试卷编号ID),title_id(题目编号ID),content(学生选的答案) 
数据如下: 
00001,60,1,A 
00001,60,2,AB 
00001,60,3,C 
00001,60,4,ABD 
00001,60,5,B 
00002,60,1,C 
00002,60,2,ABC 
00002,60,3,D 
00002,60,4,A 
00002,60,5,BD 
00003,60,1,D 
00003,60,2,ABC 
00003,60,3,AD 
00003,60,4,A 
00003,60,5,C 表:ksnr
字段:testpaper_id(试卷编号ID) ,title_id(题目编号ID),result_id(供选择的答案ID),result_name(供选择的答案)数据如下: 
60,1,1,A.答案 
60,1,2,B.答案
60,1,3,C.答案 
60,1,4,D.答案
60,2,1,A.答案
60,2,2,B.答案
60,2,3,C.答案 
60,2,4,D.答案
60,3,1,A.答案 
60,3,2,B.答案
60,3,3,C.答案 
60,3,4,D.答案
60,3,5,E.答案 并且:kst.testpaper_id = ksnr.testpaper_id  kst.title_id = ksnr.title_id
怎么写SQL 统计每道题,选A答案的有多少人,选B答案的有多少人,选C答案的有多少人,,选D答案的有多少人呢 

解决方案 »

  1.   

    有人会写?content(学生选的答案)只能根据result_name(供选择的答案) 的第一个字母来判断!
      

  2.   

    OPER@tl> select * from test;STUDENT_ID           TESTPAPER_ID   TITLE_ID CONTENT
    -------------------- ------------ ---------- --------------------
    00001                          60          1 A
    00001                          60          2 AB
    00001                          60          3 C
    00001                          60          4 ABD
    00001                          60          5 B
    00002                          60          1 C
    00002                          60          2 ABC
    00002                          60          3 D
    00002                          60          4 A
    00002                          60          5 BD
    00003                          60          1 D
    00003                          60          2 ABC
    00003                          60          3 AD
    00003                          60          4 A
    00003                          60          5 C已选择15行。OPER@tl> select * from test2;TESTPAPER_ID   TITLE_ID  RESULT_ID RESULT_NAME
    ------------ ---------- ---------- --------------------
              60          1          1 A.答案
              60          1          2 B.答案
              60          1          3 C.答案
              60          1          4 D.答案
              60          2          1 A.答案
              60          2          2 B.答案
              60          2          3 C.答案
              60          2          4 D.答案
              60          3          1 A.答案
              60          3          2 B.答案
              60          3          3 C.答案
              60          3          4 D.答案
              60          3          5 E.答案
              60          4          1 A.答案
              60          4          2 B.答案
              60          4          3 C.答案
              60          4          4 D.答案
              60          5          1 A.答案
              60          5          2 B.答案
              60          5          3 C.答案
              60          5          4 D.答案已选择21行。OPER@tl> select b.title_id,decode(b.result_id,1,'A',2,'B',3,'C',4,'D',5,'E'),
      2  sum(decode(instr(a.content,substr(b.result_name,1,1)),0,0,1)) cnt
      3  from test2 b,test a
      4  where a.testpaper_id=b.testpaper_id
      5  and a.title_id=b.title_id
      6  group by b.title_id,b.result_id
      7  order by b.title_id,b.result_id;  TITLE_ID DE        CNT
    ---------- -- ----------
             1 A           1
             1 B           0
             1 C           1
             1 D           1
             2 A           3
             2 B           3
             2 C           2
             2 D           0
             3 A           1
             3 B           0
             3 C           1
             3 D           2
             3 E           0
             4 A           3
             4 B           1
             4 C           0
             4 D           1
             5 A           0
             5 B           2
             5 C           1
             5 D           1已选择21行。OPER@tl> 
      

  3.   

    谢谢你的帮助,基本上解决了70% 我现在查的结果不是:
    TITLE_ID DE        CNT
    ---------- -- ----------
             1 A           1
             1 B           0
             1 C           1
             1 D           1
     
    而是:
    TITLE_ID DE        CNT
    ---------- -- ----------
             1 A.答案           1
             1 B.答案           0
             1 C.答案           1
             1 D.答案           1
      

  4.   

    我想看到的不是字母A,B,C,D  而是A,B,C,D 对应的汉字,因为通过看A,B,C,D 不知道学生回答的是那些东西,而看对应的汉字的话就容易知道了
      

  5.   

    你是说想显示成:
    TITLE_ID   DE        CNT 
    ---------- -- ---------- 
            1 A.答案          1 
            1 B.答案          0 
            1 C.答案          1 
            1 D.答案          1 
    这样吗?
    你把select中的decode(b.result_id,1,'A',2,'B',3,'C',4,'D',5,'E')改成RESULT_NAME不就行了?
      

  6.   

    当然你还要修改group by 啊。LZ不经常写SQL吧?
      

  7.   


    SELECT B.TITLE_ID,
           B.RESULT_NAME,
           SUM(DECODE(INSTR(A.CONTENT, SUBSTR(B.RESULT_NAME, 1, 1)), 0, 0, 1)) CNT
      FROM TEST2 B, TEST A
     WHERE A.TESTPAPER_ID = B.TESTPAPER_ID
       AND A.TITLE_ID = B.TITLE_ID
     GROUP BY B.TITLE_ID, B.RESULT_NAME
     ORDER BY B.TITLE_ID, B.RESULT_NAME;
      

  8.   

    我修改了GROUD BY 也报错啊