• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

刚才问过ABC已经解答,不过还有点小问题,请修正,谢谢!

yezby20080308 2008-03-08 05:13:58
问题:
有2表:
T1
年级 班级 科目 教师
初一 1班 语文 张三
初一 1班 数学 李四
初一 1班 英语 王五
初一 2班 美术 张三
...
T2
年级 班级 星期 节次 科目
初一 1班 星期一 第3节 语文
初一 1班 星期一 第1节 数学
初一 1班 星期三 第2节 美术
初一 2班 星期一 第6节 美术
...
我要得到我的(用户是变量)今天(通过DateTime得到今天是星期几)的课程表,即:假设我是张三,今天是星期一,我的课表行如:
科目 语文 美术
节次 初一1班第3节 初一2班第6节
_______________________________
ABC的解答:
________________
/*创建表*/
CREATE TABLE [T1]
(
[年级] NCHAR(2),
[班级] NCHAR(2),
[科目] NCHAR(2),
[教师] NCHAR(2)
)
CREATE TABLE [T2]
(
[年级] NCHAR(2),
[班级] NCHAR(2),
[星期] NCHAR(3),
[节次] NCHAR(3),
[科目] NCHAR(2)
)
GO
/*
插入一些数据
*/
INSERT INTO [T1]
SELECT '初一','1班','语文','张三' UNION ALL
SELECT '初一','1班','数学','李四' UNION ALL
SELECT '初一','1班','英语','王五' UNION ALL
SELECT '初一','2班','美术','张三'

INSERT INTO [T2]
SELECT '初一','1班','星期六','第3节','语文' UNION ALL
SELECT '初一','1班','星期一','第1节','数学' UNION ALL
SELECT '初一','1班','星期三','第2节','美术' UNION ALL
SELECT '初一','2班','星期六','第6节','美术'



/*需求查询*/
DECLARE @teacher NCHAR(2)--给出的教师名
SET @teacher='张三'

DECLARE @sql VARCHAR(8000)
SET @sql=''

SELECT @sql=@sql+',['+[科目]+']=MAX(CASE WHEN [科目]='''+[科目]+''' THEN [年级]+[班级]+[节次] ELSE NULL END)'
FROM(
SELECT [T2].[科目]
FROM [T1] JOIN [T2] ON [T1].[年级]=[T2].[年级] AND [T1].[班级]=[T2].[班级]
WHERE [T2].[星期]=DATENAME(WEEKDAY,GETDATE()) AND [T1].[教师]=@teacher
) [T]


EXEC('SELECT [科目]=''节次'''+@sql
+'FROM
(
SELECT [T2].*
FROM [T1] JOIN [T2] ON [T1].[年级]=[T2].[年级] AND [T1].[班级]=[T2].[班级]
WHERE [T2].[星期]=DATENAME(WEEKDAY,GETDATE()) AND [T1].[教师]='''+@teacher+'''
) T')


GO
/*删除创建的俩表*/

DROP TABLE [T1]
DROP TABLE [T2]

/* 结果

科目 语文 美术
---- ------- -------
节次 初一1班第3节 初一2班第6节
_______________________________________
目前的问题:
1,当有同一科目有多节时,显示有问题,如增加数据如:
INSERT INTO [T2]
SELECT '初一','1班','星期六','第3节','语文' UNION ALL
SELECT '初一','1班','星期六','第4节','语文' UNION ALL
SELECT '初一','1班','星期一','第1节','数学' UNION ALL
SELECT '初一','1班','星期三','第2节','美术' UNION ALL
SELECT '初一','2班','星期六','第6节','美术'
回出现:
节次 初一1班第4节 初一1班第4节 初一2班第6节
正常情况应该是:
节次 初一1班第3节 初一1班第4节 初一2班第6节





...全文
41 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
pt1314917 2008-03-08
加个排序就行了``
回复
loworth 2008-03-08
可以的

再次修正
建表以及其他多余的不写了 主要代码
[CODE=SQL]
DECLARE @teacher NCHAR(2)--给出的教师名
SET @teacher='张三'

DECLARE @sql VARCHAR(8000)
SET @sql=''

SELECT @sql=@sql+',['+[科目]+']=MAX(CASE WHEN [科目]='''+[科目]+''' THEN [年级]+[班级]+[节次] ELSE NULL END)'
FROM(
SELECT [T2].[科目],[节次]=MIN([T2].[节次])
FROM [T1] JOIN [T2] ON [T1].[年级]=[T2].[年级] AND [T1].[班级]=[T2].[班级]
WHERE [T2].[星期]=DATENAME(WEEKDAY,GETDATE()) AND [T1].[教师]=@teacher
GROUP BY [T2].[科目]
) [T]
ORDER BY [节次]

EXEC('SELECT [科目]=''节次'''+@sql
+'FROM
(
SELECT [T2].*
FROM [T1] JOIN [T2] ON [T1].[年级]=[T2].[年级] AND [T1].[班级]=[T2].[班级]
WHERE [T2].[星期]=DATENAME(WEEKDAY,GETDATE()) AND [T1].[教师]='''+@teacher+'''
) T GROUP BY [节次] ORDER BY [节次]')
/*结果
科目 语文 美术
---- ------- -------
节次 初一1班第3节 NULL
节次 初一1班第4节 NULL
节次 NULL 初一2班第6节

*/

[/CODE]
回复
yezby20080308 2008-03-08
TO ABC,我只能用2行来显示的,谢谢你的回答!
回复
yezby20080308 2008-03-08
TO 背着灵魂漫步:
谢谢!
可以的!还有一个小问题,就是节次能从低到高(左->右)的排列吗?
回复
loworth 2008-03-08
最好像修正后的那样 每节课查一行 这样用户也好用 程序也简单
回复
loworth 2008-03-08
修正版:

[CODE=SQL]





/*创建表*/
CREATE TABLE [T1]
(
[年级] NCHAR(2),
[班级] NCHAR(2),
[科目] NCHAR(2),
[教师] NCHAR(2)
)
CREATE TABLE [T2]
(
[年级] NCHAR(2),
[班级] NCHAR(2),
[星期] NCHAR(3),
[节次] NCHAR(3),
[科目] NCHAR(2)
)
GO
/*
插入一些数据
*/
INSERT INTO [T1]
SELECT '初一','1班','语文','张三' UNION ALL
SELECT '初一','1班','数学','李四' UNION ALL
SELECT '初一','1班','英语','王五' UNION ALL
SELECT '初一','2班','美术','张三'

INSERT INTO [T2]
SELECT '初一','1班','星期六','第3节','语文' UNION ALL
SELECT '初一','1班','星期六','第4节','语文' UNION ALL
SELECT '初一','1班','星期一','第1节','数学' UNION ALL
SELECT '初一','1班','星期三','第2节','美术' UNION ALL
SELECT '初一','2班','星期六','第6节','美术'



/*需求查询*/
DECLARE @teacher NCHAR(2)--给出的教师名
SET @teacher='张三'

DECLARE @sql VARCHAR(8000)
SET @sql=''

SELECT @sql=@sql+',['+[科目]+']=MAX(CASE WHEN [科目]='''+[科目]+''' THEN [年级]+[班级]+[节次] ELSE NULL END)'
FROM(
SELECT DISTINCT [T2].[科目] --此处加了过滤 解决第一个问题
FROM [T1] JOIN [T2] ON [T1].[年级]=[T2].[年级] AND [T1].[班级]=[T2].[班级]
WHERE [T2].[星期]=DATENAME(WEEKDAY,GETDATE()) AND [T1].[教师]=@teacher
) [T]


EXEC('SELECT [科目]=''节次'''+@sql
+'FROM
(
SELECT [T2].*
FROM [T1] JOIN [T2] ON [T1].[年级]=[T2].[年级] AND [T1].[班级]=[T2].[班级]
WHERE [T2].[星期]=DATENAME(WEEKDAY,GETDATE()) AND [T1].[教师]='''+@teacher+'''
) T GROUP BY [节次]') ----此处加分组 解决第二个问题


GO
/*删除创建的俩表*/

DROP TABLE [T1]
DROP TABLE [T2]


/*结果

科目 美术 语文
---- ------- -------
节次 NULL 初一1班第3节
节次 NULL 初一1班第4节
节次 初一2班第6节 NULL

*/





[/CODE]
回复
yezby20080308 2008-03-08
TO 背着灵魂漫步:
谢谢你!有点问题的,当一个教师教2个以上班级的相同科目时也是显示一个班级的科目,也就是说同一科目在同一天:1,有不同的节次;2,有不同的班级时显示都有问题的.
那你运行看一下吧,
create table t1(年级 varchar(10),班级 varchar(10),科目 varchar(10),教师 varchar(10))
insert into t1 select '初一','1班','语文','张三'
insert into t1 select '初一','1班','数学','李四'
insert into t1 select '初一','1班','英语','王五'
insert into t1 select '初一','2班','美术','张三'


create table t2(年级 varchar(10),班级 varchar(10),星期 varchar(10),节次 varchar(10),科目 varchar(10))
insert into t2 select '初一','1班','星期一','第3节','语文'
insert into t2 select '初一','1班','星期一','第1节','语文'
insert into t2 select '初一','1班','星期三','第2节','美术'
insert into t2 select '初一','2班','星期一','第6节','美术'
INSERT INTO [T2]
SELECT '初一','1班','星期六','第3节','语文' UNION ALL
SELECT '初一','1班','星期六','第4节','语文' UNION ALL
SELECT '初一','1班','星期一','第1节','数学' UNION ALL
SELECT '初一','1班','星期三','第2节','美术' UNION ALL
SELECT '初一','2班','星期六','第6节','美术'



alter proc os_t
@教师 varchar(10),
@星期 varchar(10)
as
select a.*,b.星期,b.节次 into #t from t1 a,t2 b where a.年级=b.年级 and a.班级=b.班级 and a.科目=b.科目
and a.教师=@教师 and b.星期=@星期
declare @sql1 varchar(8000)
set @sql1='select ''节次''[科目]'
select @sql1=@sql1+',['+科目+']=max(case 科目 when '''+科目+''' then 年级+班级+节次 else '''' end)' from #t
set @sql1=@sql1+' from #t'
exec(@sql1)
go


exec os_t '张三','星期一'

回复
pt1314917 2008-03-08

--楼主试试这样:

create proc os_t
@教师 varchar(10),
@星期 varchar(10)
as
select a.*,b.星期,b.节次 into #t from t1 a,t2 b where a.年级=b.年级 and a.班级=b.班级 and a.科目=b.科目
and a.教师=@教师 and b.星期=@星期
declare @sql1 varchar(8000)
set @sql1='select ''节次''[科目]'
select @sql1=@sql1+',['+科目+']=max(case 科目+节次 when '''+科目+节次+''' then 年级+班级+节次 else '''' end)' from #t
set @sql1=@sql1+' from #t'
exec(@sql1)
go


exec os_t '张三','星期六'

--结果:
科目 语文 语文 美术
节次 初一1班第3节 初一1班第4节 初一2班第6节
回复
yezby20080308 2008-03-08
而且,当一个教师教2个以上班级的相同科目时也是显示一个班级的科目,也就是说同一科目在同一天:1,有不同的节次;2,有不同的班级时显示都有问题的.
回复
pt1314917 2008-03-08

--楼主,刚才我的存储过程有什么问题吗?

create table t1(年级 varchar(10),班级 varchar(10),科目 varchar(10),教师 varchar(10))
insert into t1 select '初一','1班','语文','张三'
insert into t1 select '初一','1班','数学','李四'
insert into t1 select '初一','1班','英语','王五'
insert into t1 select '初一','2班','美术','张三'


create table t2(年级 varchar(10),班级 varchar(10),星期 varchar(10),节次 varchar(10),科目 varchar(10))
insert into t2 select '初一','1班','星期一','第3节','语文'
insert into t2 select '初一','1班','星期一','第1节','数学'
insert into t2 select '初一','1班','星期三','第2节','美术'
insert into t2 select '初一','2班','星期一','第6节','美术'
INSERT INTO [T2]
SELECT '初一','1班','星期六','第3节','语文' UNION ALL
SELECT '初一','1班','星期六','第4节','语文' UNION ALL
SELECT '初一','1班','星期一','第1节','数学' UNION ALL
SELECT '初一','1班','星期三','第2节','美术' UNION ALL
SELECT '初一','2班','星期六','第6节','美术'



alter proc os_t
@教师 varchar(10),
@星期 varchar(10)
as
select a.*,b.星期,b.节次 into #t from t1 a,t2 b where a.年级=b.年级 and a.班级=b.班级 and a.科目=b.科目
and a.教师=@教师 and b.星期=@星期
declare @sql1 varchar(8000)
set @sql1='select ''节次''[科目]'
select @sql1=@sql1+',['+科目+']=max(case 科目 when '''+科目+''' then 年级+班级+节次 else '''' end)' from #t
set @sql1=@sql1+' from #t'
exec(@sql1)
go


exec os_t '张三','星期一'
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-03-08 05:13
社区公告
暂无公告