当前位置: 代码迷 >> Sql Server >> 真心,关于一个建立视图的有关问题
  详细解决方案

真心,关于一个建立视图的有关问题

热度:35   发布时间:2016-04-27 11:06:56.0
真心求助,关于一个建立视图的问题
场景:这是关于学生和选修课分数的问题,我设计了两个表T_Class(课程表)和T_Exam(考试分数表),结构如下
T_Class(课程表):
class_id(主键)
class_name(课程名称)
class_code(课程代码)

T_Exam(考试分数表):
exam_id(主键)
student(学生名字)
class_id(课程ID,对应T_Class主键)
class_mark(考试分数)

数据如下:
T_Class:
class_id|class_name|class_code
1|语文|yuwen
2|数学|shuxue
3|英语|yingyu

T_Exam:
exam_id|student|class_id|class_mark|
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
意思是在视图中将所有课程列出来,然后以课程代码为课程的字段名,再将学生的考试分数依次填进去,没有选课的填“--”

真心求助,希望各位大大能帮助小弟,不尽感谢!

------解决方案--------------------
帖子刷的太快,找不到了,现在才找到
SQL code
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_mark 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_mark)SELECT 'A同学',1,80UNION ALL SELECT 'A同学',2,90UNION ALL SELECT 'B同学',2,85UNION ALL SELECT 'B同学',3,75UNION ALL SELECT 'C同学',1,85UNION ALL SELECT 'C同学',3,95goCREATE VIEW testAS SELECT a.student AS 'student(学生名字)','yuwen(语文课程代码)'=isnull(MAX(CASE WHEN a.class_id=1 THEN CONVERT(varchar(10),class_mark) END ),'--'),'shuxue(数学课程代码)'=isnull(MAX(CASE WHEN a.class_id=2 THEN CONVERT(varchar(10),class_mark) END ),'--'),'yingyu(英语课程代码)'=isnull(MAX(CASE WHEN a.class_id=3 THEN CONVERT(varchar(10),class_mark) 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.00C同学                  85.00         --             95.00警告: 聚合或其他 SET 操作消除了 Null 值。(3 行受影响) */
  相关解决方案