ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » MS SQL Server » 一个变态的题目和一个变态的解法

标题: [笔记] 一个变态的题目和一个变态的解法
离线 gma
初级会员



精华贴数 0
个人空间 0
技术积分 77 (20103)
社区积分 0 (224533)
注册日期 2004-12-9
论坛徽章:0
      
      

发表于 2008-7-1 10:51 
一个变态的题目和一个变态的解法

题目如下:

教室表tbl_ClassRoom
create table tbl_ClassRoom
(
        [ID] tinyint identity(1,1) primary key,                --系统编号
        RoomName Varchar(50),                                --教室名称,101 、102
        RoomAddress Varchar(50),                        --地址,如A栋1楼101室,B栋1楼101室
        RoomCapacity Int                                --教室容量
)
时段表:tbl_Time
create table tbl_Time
(
        [ID] tinyint identity(1,1) primary key,                --系统编号
        TimeName varchar(20),                                --时间段名称,如:11:00-12:00                        
        BeginTime varchar(10),                                --开始时间,如:11:00
        EndTime varchar(10)                                --结束时间,如:12:00
)
教室 - 时间段表tbl_Room_Time
create table tbl_Room_Time
(
        [ID] bigint identity(1,1) primary key,                --系统编号        
        RoomID varchar(30),                                --教室编号,关联tbl_Room.[ID]
        RoomName Varchar(20),                                --教室名称  ----我认为冗余
        [WeekDay] Varchar(10),                                --周几
        TimeID tinyint,                                        --时间段ID,关联tbl_Time.[ID]
        TimeName Varchar(20),                                --时间段名称  --我认为冗余
        IsUse bit                                        --是否可用
)        
写个sql显示上面这张图的效果


我的变态的解法:
思路:
从时段表中用游标取出各个字段,做为结果集中的字段名.生成动态SQL,然后再查询出结果集.
<主要是觉得麻烦,想找个更好的办法.>
create table tbl_ClassRoom
(
[ID] tinyint identity(1,1) primary key,  --系统编号
RoomName Varchar(50),    --教室名称,101 、
RoomAddress Varchar(50),   --地址,如A栋楼室,B栋楼室
RoomCapacity Int    --教室容量
)
go
insert into tbl_classRoom values ('Room1','address1',30)
insert into tbl_classRoom values ('Room2','address2',20)
insert into tbl_classRoom values ('Room3','address3',80)
go
create table tbl_Time
(
[ID] tinyint identity(1,1) primary key,  --系统编号
TimeName varchar(20),    --时间段名称,如::00-12:00   
BeginTime varchar(10),    --开始时间,如::00
EndTime varchar(10)    --结束时间,如::00
)
go
insert into tbl_time values ('10:00-11:00','10:00','11:00')
insert into tbl_time values ('10:00-11:00','11:00','12:00')
insert into tbl_time values ('10:00-11:00','12:00','13:00')
insert into tbl_time values ('10:00-11:00','13:00','14:00')
insert into tbl_time values ('10:00-11:00','14:00','15:00')
insert into tbl_time values ('10:00-11:00','15:00','16:00')
insert into tbl_time values ('10:00-11:00','16:00','17:00')
update tbl_Time set timeName=BeginTime+'-'+endTime

go
create table tbl_Room_Time
(
[ID] bigint identity(1,1) primary key,  --系统编号
RoomID tinyint,    --教室编号,关联tbl_Room.[ID]  change Type varchar to tinyint
--RoomName Varchar(20),    --教室名称----冗余,个人认为没有必要
[WeekDay] Varchar(10),    --周几
TimeID tinyint,     --时间段ID,关联tbl_Time.[ID]
--TimeName Varchar(20),   --时间段名称--冗余,个人认为没有必要
IsUse bit     --是否可用
)
go
alter  table tbl_Room_Time add
constraint fk_RoomID foreign key (Roomid) references tbl_ClassRoom([ID]),
constraint fk_TimeID foreign key (TimeID) references tbl_Time([id])
go
--第11,12周安排
insert into tbl_Room_Time values (1,'11',7,0)
insert into tbl_Room_Time values (2,'11',7,1)
insert into tbl_Room_Time values (3,'11',7,0)
insert into tbl_Room_Time values (1,'11',1,0)
insert into tbl_Room_Time values (2,'11',1,0)
insert into tbl_Room_Time values (3,'11',1,0)
insert into tbl_Room_Time values (1,'11',2,1)
insert into tbl_Room_Time values (2,'11',2,0)
insert into tbl_Room_Time values (3,'11',2,0)
insert into tbl_Room_Time values (1,'11',3,1)
insert into tbl_Room_Time values (2,'11',3,0)
insert into tbl_Room_Time values (3,'11',3,1)
insert into tbl_Room_Time values (1,'11',4,1)
insert into tbl_Room_Time values (2,'11',4,1)
insert into tbl_Room_Time values (3,'11',4,1)
insert into tbl_Room_Time values (1,'11',5,1)
insert into tbl_Room_Time values (2,'11',5,0)
insert into tbl_Room_Time values (3,'11',5,0)
insert into tbl_Room_Time values (1,'11',6,1)
insert into tbl_Room_Time values (2,'11',6,1)
insert into tbl_Room_Time values (3,'11',6,1)
--第周安排
insert into tbl_Room_Time values (1,'12',5,1)
insert into tbl_Room_Time values (2,'12',5,0)
insert into tbl_Room_Time values (3,'12',5,1)
insert into tbl_Room_Time values (1,'12',4,0)
insert into tbl_Room_Time values (2,'12',4,1)
insert into tbl_Room_Time values (3,'12',4,0)
insert into tbl_Room_Time values (1,'12',3,1)
insert into tbl_Room_Time values (2,'12',3,1)
insert into tbl_Room_Time values (3,'12',3,1)
insert into tbl_Room_Time values (1,'12',2,1)
insert into tbl_Room_Time values (2,'12',2,0)
insert into tbl_Room_Time values (3,'12',2,0)
insert into tbl_Room_Time values (1,'12',1,0)
insert into tbl_Room_Time values (2,'12',1,1)
insert into tbl_Room_Time values (3,'12',1,0)
insert into tbl_Room_Time values (1,'12',6,0)
insert into tbl_Room_Time values (2,'12',6,0)
insert into tbl_Room_Time values (3,'12',6,1)
insert into tbl_Room_Time values (1,'12',7,1)
insert into tbl_Room_Time values (2,'12',7,0)
insert into tbl_Room_Time values (3,'12',7,1)
go
select * from tbl_ClassRoom
select * from tbl_Time order by beginTime
select * from tbl_Room_Time
go
create proc GetRoomTimeByWeekDay( @wkDay int =0)
as
begin
declare @sqlstr nvarchar(4000)
declare @TimeID nvarchar(4)
declare @TimeName varchar(80)
declare @head varchar(200)
declare @foot varchar(2000)
set @sqlstr=''
if (@wkDay=0)
begin
set @head='select roomName,[weekday], '
set @foot=' from (select a.weekday, a.roomid,a.timeid,a.isuse,b.id,c.roomName from tbl_Room_Time A,tbl_Time B,tbl_ClassRoom C
WHERE A.ROOMID=C.ID AND A.TIMEID=B.ID  ) abc group by roomName,[WeekDay]'
end
else --按周分组
begin
  set @head='select roomName,'
  set @foot=' from (select  a.roomid,a.timeid,a.isuse,b.id,c.roomName from tbl_Room_Time A,tbl_Time B,tbl_ClassRoom C
  WHERE A.ROOMID=C.ID AND A.TIMEID=B.ID and weekday='+convert(varchar(4),@wkday)+' ) abc group by roomName'
end
DECLARE cur  CURSOR
READ_ONLY
FOR select id,timeName from tbl_Time order by beginTime
open cur
FETCH NEXT FROM cur INTO @Timeid,@TimeName
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
  set @sqlstr=@sqlstr+''''+@timeName+''''+'=max(case when [email=timeid=]timeid='+@Timeid+'[/email] then convert(char(4),isuse) end),'
END
FETCH NEXT FROM cur INTO @Timeid,@TimeName
END
CLOSE cur
DEALLOCATE cur
set @sqlstr=@head+ left (@sqlstr,len(@sqlstr)-1)+@foot
exec (@sqlstr)
end
go
exec GetRoomTimebyWeekday 0
go
--第周的数据
exec GetRoomTimebyWeekday 11
--第周的数据
exec GetRoomTimebyWeekday 12
go
exec GetRoomTimebyWeekday 0

[ 本帖最后由 gma 于 2008-7-1 10:57 编辑 ]


__________________
日出东海落西山,愁也一天,喜也一天;遇事不钻牛角尖,人也舒坦, 心也舒坦
只看该作者    顶部
离线 cyt2005
老会员


来自 天津
精华贴数 0
个人空间 0
技术积分 2346 (669)
社区积分 83 (3783)
注册日期 2006-3-9
论坛徽章:10
会员2007贡献徽章2008北京奥运纪念徽章:摔跤2008北京奥运纪念徽章:艺术体操2008北京奥运纪念徽章:举重生肖徽章2007版:虎生肖徽章2007版:兔
生肖徽章2007版:鼠生肖徽章2007版:猴生肖徽章2007版:牛ITPUB新首页上线纪念徽章  

发表于 2008-7-1 11:23 
没细看,感觉就是可变行数的行列转换


__________________
饥饿艺术家说着,小脑袋微微抬起,嘴唇像要吻看管人似的,直贴在他的耳根,生怕露掉一个字,“因为我找不到适合我胃口的食物。假如我找到这样的食物,请相信我,我不会招人参观,惹人显眼,并像你,像大伙一样,吃得饱饱的。”
只看该作者    顶部
离线 gma
初级会员



精华贴数 0
个人空间 0
技术积分 77 (20103)
社区积分 0 (224533)
注册日期 2004-12-9
论坛徽章:0
      
      

发表于 2008-7-1 11:37 
回复 #2 cyt2005 的帖子

谢谢cty2005
如果我在时间表中增加一行.那么从教室时间表中查询出来的结果就会多出一列来.
所以我认为列数也是可变的.
可我就是没有能找到一个理想,简便的方法.


__________________
日出东海落西山,愁也一天,喜也一天;遇事不钻牛角尖,人也舒坦, 心也舒坦
只看该作者    顶部
离线 allys586



精华贴数 0
个人空间 0
技术积分 14 (72809)
社区积分 0 (1807081)
注册日期 2008-6-24
论坛徽章:0
      
      

发表于 2008-7-1 12:22 
恩,学习一下





www.zgsj.com.cn


__________________
中国数据 www.zgsj.com.cn 电话025-86883421-8006 QQ:915950381
只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问