场景:这是关于学生和选修课分数的问题,我设计了两个表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
意思是在视图中将所有课程列出来,然后以课程代码为课程的字段名,再将学生的考试分数依次填进去,没有选课的填“--”真心求助,希望各位大大能帮助小弟,不尽感谢!
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
意思是在视图中将所有课程列出来,然后以课程代码为课程的字段名,再将学生的考试分数依次填进去,没有选课的填“--”真心求助,希望各位大大能帮助小弟,不尽感谢!
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 行受影响)
*/
,'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 ),'--')这部分,这部分是新增的列,生物、化学、物理、政治.....如果没数据,就会是--,所以没影响。