日期:2014-05-17  浏览次数:20493 次

真心求助,关于一个建立视图的问题
场景:这是关于学生和选修课分数的问题,我设计了两个表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,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
go

CREATE VIEW test
AS 
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.00
C同学                  85.00         --             95.00
警告: 聚合或其他 SET 操作消除了 Null 值。

(3 行受影响)


 */