日期:2014-05-18  浏览次数:20468 次

这个视图如何建立
现在有以下几个表:

班级列表

年级 班
初一 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 张飞 赵一 孙兵

并且以后对班级任课表的修改通过对这几个视图的修改来实现,不知道这样设计合不合理,如果可行的话,怎样实现?谢谢

------解决方案--------------------
行转列
------解决方案--------------------
SQL code

create table 班级任课表 
(年级 varchar(6), 班 int, 科目 varchar(6), 教师 varchar(6))

insert into 班级任课表
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', '英语', '孙兵'

--1
create view 初一视图
as
with 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           赵一     周三    

--2
create view 初二视图
as
with 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           刘备            钱二

--3
create view 初三视图
as
with 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 英语 孙兵