场景:这是关于学生和选修课分数的问题,我设计了两个表T_Class(课程表)和T_Exam(考试分数表),结构如下
T_Class(课程表):
class_id(主键)
class_name(课程名称)
class_code(课程代码)T_Exam(考试分数表):
exam_id(主键)
student(学生名字)
class_id(课程ID,对应T_Class主键)
class_(考试分数)数据如下:
T_Class:
class_id|class_name|class_code
1|语文|yuwen
2|数学|shuxue
3|英语|yingyuT_Exam:
exam_id|student|class_id|class_|
1|A同学|1|80
2|A同学|2|90
3|B同学|2|85
4|B同学|3|75
5|C同学|1|85
6|C同学|3|95
意思是说,一位同学可以选课程的一个或多个,如A同学选了语文和数学,考试分数为80、90求助:我想根据上面两个表写一个视图V_Exam,视图结构和数据如下
student(学生名字)|yuwen(语文课程代码)|shuxue(数学课程代码)|yingyu(英语课程代码)|
A同学|80|90|--
B同学|--|85|75
C同学|85|--|95
意思是在视图中将所有课程列出来,然后以课程代码为课程的字段名,再将学生的考试分数依次填进去,没有选课的填“--”真心求助,希望各位大大能帮助小弟,不尽感谢!

解决方案 »

  1.   

    纯select语句你会写不?case when来判断不就可以咯
      

  2.   

    帖子刷的太快,找不到了,现在才找到
    CREATE TABLE T_Class(
    class_id   int IDENTITY(1,1) PRIMARY KEY,
    class_name varchar(20),
    class_code varchar(20)
    )CREATE TABLE T_Exam
    (
    exam_id int IDENTITY(1,1) PRIMARY KEY,
    student varchar(20),
    class_id int FOREIGN KEY REFERENCES t_class(class_id),
    class_ decimal(4,2)
    )INSERT INTO t_class(class_name,class_code)
    SELECT '语文','yuwen'
    UNION ALL 
    SELECT '数学','shuxue'
    UNION ALL 
    SELECT '英语','yingyu'INSERT INTO T_Exam(student,class_id,class_)
    SELECT 'A同学',1,80
    UNION ALL 
    SELECT 'A同学',2,90
    UNION ALL 
    SELECT 'B同学',2,85
    UNION ALL 
    SELECT 'B同学',3,75
    UNION ALL 
    SELECT 'C同学',1,85
    UNION ALL 
    SELECT 'C同学',3,95
    goCREATE VIEW test
    AS 
    SELECT a.student AS 'student(学生名字)','yuwen(语文课程代码)'=isnull(MAX(CASE WHEN a.class_id=1 THEN CONVERT(varchar(10),class_) END ),'--')
    ,'shuxue(数学课程代码)'=isnull(MAX(CASE WHEN a.class_id=2 THEN CONVERT(varchar(10),class_) END ),'--')
    ,'yingyu(英语课程代码)'=isnull(MAX(CASE WHEN a.class_id=3 THEN CONVERT(varchar(10),class_) END ),'--')
     FROM t_exam a LEFT JOIN T_Class b ON A.class_id=b.class_id
     GROUP BY a.student
     
     SELECT * FROM test
     
     /*
     student(学生名字)        yuwen(语文课程代码) shuxue(数学课程代码) yingyu(英语课程代码)
    -------------------- ------------- -------------- --------------
    A同学                  80.00         90.00          --
    B同学                  --            85.00          75.00
    C同学                  85.00         --             95.00
    警告: 聚合或其他 SET 操作消除了 Null 值。(3 行受影响)
     */
      

  3.   

    谢谢这位大哥,问题解决一半了,还有一半未解决,因为这里T_Class(课程表)的记录数会发生变化,例如我可以随时增加一门生物课,所以视图V_Exam的列应该是动态生成的,再次想请问一下该如何解决,小弟在此谢谢
      

  4.   

    SELECT a.student AS 'student(学生名字)','yuwen(语文课程代码)'=isnull(MAX(CASE WHEN a.class_id=1 THEN CONVERT(varchar(10),class_) END ),'--')
     ,'shuxue(数学课程代码)'=isnull(MAX(CASE WHEN a.class_id=2 THEN CONVERT(varchar(10),class_) END ),'--')
     ,'yingyu(英语课程代码)'=isnull(MAX(CASE WHEN a.class_id=3 THEN CONVERT(varchar(10),class_) END ),'--')
     ,'这里填生物或者其他科目'=isnull(MAX(CASE WHEN a.class_id=这里也要跟着改 THEN CONVERT(varchar(10),class_) END ),'--')
      FROM t_exam a LEFT JOIN T_Class b ON A.class_id=b.class_id
      GROUP BY a.student根据你这个应用,科目不会无限增大,一般都只有固定的科目,所以你完全可以全部都写上,就是复制 ,'这里填生物或者其他科目'=isnull(MAX(CASE WHEN a.class_id=这里也要跟着改 THEN CONVERT(varchar(10),class_) END ),'--')这部分,这部分是新增的列,生物、化学、物理、政治.....如果没数据,就会是--,所以没影响。