这个视图如何建立
现在有以下几个表:
班级列表
年级班
初一1
初一3
初二2
初二3
初二4
初三1
初三2
初三3
年级开课表
年级科目
初一语文
初一数学
初二语文
初二英语
初三语文
初三数学
初三英语
我根据以上两个表生成以下这个表:
班级任课表
年级班科目教师
初一1语文赵一
初一3语文赵一
初一1数学钱二
初一3数学周三
初二2语文孙兵
初二3语文张飞
初二4语文刘备
初二2英语赵一
初二3英语赵一
初二4英语钱二
初三1语文周三
初三2语文孙兵
初三3语文张飞
初三1数学刘备
初三2数学赵一
初三3数学赵一
初三1英语钱二
初三2英语周三
初三3英语孙兵
我想通过一个存储过程来建立以下视图(视图的数量及名称由年级开课表确定):
初一视图
班语文数学
1赵一钱二
3赵一周三
初二视图
班语文英语
2孙兵赵一
3张飞赵一
4刘备钱二
初三视图
班语文数学英语
1周三刘备钱二
2孙兵赵一周三
3张飞赵一孙兵
并且以后对班级任课表的修改通过对这几个视图的修改来实现,不知道这样设计合不合理,如果可行的话,怎样实现?谢谢
[解决办法]
行转列
[解决办法]
create table 班级任课表 (年级 varchar(6), 班 int, 科目 varchar(6), 教师 varchar(6))insert into 班级任课表select '初一', '1', '语文', '赵一' union allselect '初一', '3', '语文', '赵一' union allselect '初一', '1', '数学', '钱二' union allselect '初一', '3', '数学', '周三' union allselect '初二', '2', '语文', '孙兵' union allselect '初二', '3', '语文', '张飞' union allselect '初二', '4', '语文', '刘备' union allselect '初二', '2', '英语', '赵一' union allselect '初二', '3', '英语', '赵一' union allselect '初二', '4', '英语', '钱二' union allselect '初三', '1', '语文', '周三' union allselect '初三', '2', '语文', '孙兵' union allselect '初三', '3', '语文', '张飞' union allselect '初三', '1', '数学', '刘备' union allselect '初三', '2', '数学', '赵一' union allselect '初三', '3', '数学', '赵一' union allselect '初三', '1', '英语', '钱二' union allselect '初三', '2', '英语', '周三' union allselect '初三', '3', '英语', '孙兵'--1create view 初一视图aswith t as(select 年级,班,max(case when 科目='语文' then 教师 else '' end) '语文',max(case when 科目='数学' then 教师 else '' end) '数学',max(case when 科目='英语' then 教师 else '' end) '英语'from 班级任课表 group by 年级,班)select 班,语文,数学,英语 from t where 年级='初一'select * from 初一视图班 语文 数学 英语----------- ------ ------ ------1 赵一 钱二 3 赵一 周三 --2create view 初二视图aswith t as(select 年级,班,max(case when 科目='语文' then 教师 else '' end) '语文',max(case when 科目='数学' then 教师 else '' end) '数学',max(case when 科目='英语' then 教师 else '' end) '英语'from 班级任课表 group by 年级,班)select 班,语文,数学,英语 from t where 年级='初二'select * from 初二视图班 语文 数学 英语----------- ------ ------ ------2 孙兵 赵一3 张飞 赵一4 刘备 钱二--3create view 初三视图aswith t as(select 年级,班,max(case when 科目='语文' then 教师 else '' end) '语文',max(case when 科目='数学' then 教师 else '' end) '数学',max(case when 科目='英语' then 教师 else '' end) '英语'from 班级任课表 group by 年级,班)select 班,语文,数学,英语 from t where 年级='初三'select * from 初三视图班 语文 数学 英语----------- ------ ------ ------1 周三 刘备 钱二2 孙兵 赵一 周三3 张飞 赵一 孙兵
[解决办法]
一定要视图+动态SQL的话,貌似行不通喔.
[解决办法]
/*
现在有以下几个表:
班级列表
年级 班
初一 1
初一 3
初二 2
初二 3
初二 4
初三 1
初三 2
初三 3
年级开课表
年级 科目
初一 语文
初一 数学
初二 语文
初二 英语
初三 语文
初三 数学
初三 英语
我根据以上两个表生成以下这个表:
班级任课表
年级 班 科目 教师
初一 1 语文 赵一
初一 3 语文 赵一
初一 1 数学 钱二
初一 3 数学 周三
初二 2 语文 孙兵
初二 3 语文 张飞
初二 4 语文 刘备
初二 2 英语 赵一
初二 3 英语 赵一
初二 4 英语 钱二
初三 1 语文 周三
初三 2 语文 孙兵
初三 3 语文 张飞
初三 1 数学 刘备
初三 2 数学 赵一
初三 3 数学 赵一
初三 1 英语 钱二
初三 2 英语 周三
初三 3 英语 孙兵
我想通过一个存储过程来建立以下视图(视图的数量及名称由年级开课表确定):
初一视图
班 语文 数学
1 赵一 钱二
3 赵一 周三
初二视图
班 语文 英语
2 孙兵 赵一
3 张飞 赵一
4 刘备 钱二
初三视图
班 语文 数学 英语
1 周三 刘备 钱二
2 孙兵 赵一 周三
3 张飞 赵一 孙兵
并且以后对班级任课表的修改通过对这几个视图的修改来实现,
不知道这样设计合不合理,如果可行的话,怎样实现?谢谢
*/
go
if object_id('C') is not null
drop table C
go
create table C(
grade varchar(4),
class varchar(4)
)
go
insert C
select '初一','1' union all
select '初一','3' union all
select '初二','2' union all
select '初二','3' union all
select '初二','4' union all
select '初三','1' union all
select '初三','2' union all
select '初三','3'
go
if object_id('Cou') is not null
drop table Cou
go
create table Cou(
grade varchar(4),
course varchar(4)
)
insert Cou
select '初一','语文' union all
select '初一','数学' union all
select '初二','语文' union all
select '初二','英语' union all
select '初三','语文' union all
select '初三','数学' union all
select '初三','英语'
go
if OBJECT_ID('clacou') is not null
drop table clacou
go
create table clacou(
grade varchar(4),
class int,
course varchar(4),
teacher varchar(10)
)
go
insert clacou
select '初一', '1', '语文', '赵一' union all
select '初一', '3', '语文', '赵一' union all
select '初一', '1', '数学', '钱二' union all
select '初一', '3', '数学', '周三' union all
select '初二', '2', '语文', '孙兵' union all
select '初二', '3', '语文', '张飞' union all
select '初二', '4', '语文', '刘备' union all
select '初二', '2', '英语', '赵一' union all
select '初二', '3', '英语', '赵一' union all
select '初二', '4', '英语', '钱二' union all
select '初三', '1', '语文', '周三' union all
select '初三', '2', '语文', '孙兵' union all
select '初三', '3', '语文', '张飞' union all
select '初三', '1', '数学', '刘备' union all
select '初三', '2', '数学', '赵一' union all
select '初三', '3', '数学', '赵一' union all
select '初三', '1', '英语', '钱二' union all
select '初三', '2', '英语', '周三' union all
select '初三', '3', '英语', '孙兵'
/*
select C.grade,C.class,Cou.course from C
inner join Cou on C.grade=Cou.grade
*/
--创建初一试图:
go
if OBJECT_ID('grade_one') is not null
drop view grade_one
go
create view grade_one as
select class,
max(case when course='语文' then teacher else '' end) as 语文,
max(case when course='数学' then teacher else '' end) as 数学
from clacou where grade='初一' group by grade,class
go
select * from grade_one
/*
class语文数学
1赵一钱二
3赵一周三
*/
--创建初二试图:
go
if OBJECT_ID('grade_two') is not null
drop view grade_two
go
create view grade_two as
select class,
max(case when course='语文' then teacher else '' end) as 语文,
max(case when course='英语' then teacher else '' end) as 英语
from clacou where grade='初二' group by grade,class
go
select * from grade_two
/*
class语文英语
2孙兵赵一
3张飞赵一
4刘备钱二
*/
--创建初三视图:
go
if OBJECT_ID('grade_three') is not null
drop view grade_three
go
create view grade_three as
select class,
max(case when course='语文' then teacher else '' end) as 语文,
max(case when course='数学' then teacher else '' end) as 数学,
max(case when course='英语' then teacher else '' end) as 英语
from clacou where grade='初三' group by grade,class
go
select * from grade_three
/*
class语文数学英语
1周三刘备钱二
2孙兵赵一周三
3张飞赵一孙兵
*/
怎么生成第三张表不会,直接创建了