主题:对7月17日[SQL 语句,感兴趣看看!]之贴有感
表1 表2
学号 姓名 班级 学号 学年 学期 职务
11 aa 01 11 2005-2006 2 班长
12 bb 01 12 2005-2006 2 团支书
13 cc 01 13 2005-2006 2 学习委员
14 ee 01
15 aaa 02 15 2005-2006 2 班长
......想得到这样一张统计2005-2006学年第2学期每个班的班委的名单的
表3
班级 班长 团支书 学习委员 宣传委员 体育委员 生活委员 文艺委员
01 aa bb cc
02 aaa
我第一次到这个讨论区,发现了这道题,刚开始觉得很简单,于是试着做了一下才发现不是这么回事,后来费了不少脑筋才完成,不一定是最好的解题方法,我想还有更好的,请各位指正。
IF EXISTS(SELECT NAME FROM sysobjects WHERE NAME='C')
DROP TABLE c
GO
--定义b表职务游标,取唯一值
DECLARE b_cursor CURSOR SCROLL FOR
SELECT DISTINCT 职务 FROM b
--定义建立c表即查询表语句变量
DECLARE @xjbyj varchar(1000)
--定义b表职务列名变量
DECLARE @lm varchar(10)
SET @xjbyj =''
SET @lm=''
OPEN b_cursor
--开始向建立c表语句变量@xjbyj赋值
SET @xjbyj='CREATE TABLE c(班级 int,'
-- 移到第一行并向职务列名变量@lm赋值,自动获取列名
FETCH NEXT FROM b_cursor INTO @lm
-- 判断是否成功
WHILE @@FETCH_STATUS = 0
BEGIN
SET @xjbyj=@xjbyj+@lm+' varchar(20),'
-- 如果成功继续向职务列名变量@lm赋值
FETCH NEXT FROM b_cursor INTO @lm
END
SET @xjbyj=@xjbyj+')'
--执行建立c表语句
EXEC (@xjbyj)
--自动获取班级
INSERT c(班级) SELECT DISTINCT 班级 FROM a
SET @xjbyj=''
SET @lm=''
-- 继续使用b_cursor,移到第一行并向职务列名变量@lm赋值
FETCH FIRST FROM b_cursor INTO @lm
-- 判断是否成功
WHILE @@FETCH_STATUS = 0
BEGIN
--更新其他列
SET @xjbyj=@xjbyj+'UPDATE c SET ' + @lm + '= d.姓名 FROM c,'
SET @xjbyj=@xjbyj+' (SELECT a.*,b.学年,b.学期,b.职务 FROM a INNER JOIN b ON a.学号=b.学号) d'
SET @xjbyj=@xjbyj+' WHERE d.职务='''+ @lm + ''' AND c.班级=d.班级 AND d.学年=''2005-2006'''
SET @xjbyj=@xjbyj+' AND d.学期 = 2'
--执行更新c表语句
EXEC (@xjbyj)
--重置,找第二条职务
SET @xjbyj=''
-- 如果成功继续向职务列名变量@lm赋值
FETCH NEXT FROM b_cursor INTO @lm
END
CLOSE b_cursor
DEALLOCATE b_cursor
GO
学号 姓名 班级 学号 学年 学期 职务
11 aa 01 11 2005-2006 2 班长
12 bb 01 12 2005-2006 2 团支书
13 cc 01 13 2005-2006 2 学习委员
14 ee 01
15 aaa 02 15 2005-2006 2 班长
......想得到这样一张统计2005-2006学年第2学期每个班的班委的名单的
表3
班级 班长 团支书 学习委员 宣传委员 体育委员 生活委员 文艺委员
01 aa bb cc
02 aaa
我第一次到这个讨论区,发现了这道题,刚开始觉得很简单,于是试着做了一下才发现不是这么回事,后来费了不少脑筋才完成,不一定是最好的解题方法,我想还有更好的,请各位指正。
IF EXISTS(SELECT NAME FROM sysobjects WHERE NAME='C')
DROP TABLE c
GO
--定义b表职务游标,取唯一值
DECLARE b_cursor CURSOR SCROLL FOR
SELECT DISTINCT 职务 FROM b
--定义建立c表即查询表语句变量
DECLARE @xjbyj varchar(1000)
--定义b表职务列名变量
DECLARE @lm varchar(10)
SET @xjbyj =''
SET @lm=''
OPEN b_cursor
--开始向建立c表语句变量@xjbyj赋值
SET @xjbyj='CREATE TABLE c(班级 int,'
-- 移到第一行并向职务列名变量@lm赋值,自动获取列名
FETCH NEXT FROM b_cursor INTO @lm
-- 判断是否成功
WHILE @@FETCH_STATUS = 0
BEGIN
SET @xjbyj=@xjbyj+@lm+' varchar(20),'
-- 如果成功继续向职务列名变量@lm赋值
FETCH NEXT FROM b_cursor INTO @lm
END
SET @xjbyj=@xjbyj+')'
--执行建立c表语句
EXEC (@xjbyj)
--自动获取班级
INSERT c(班级) SELECT DISTINCT 班级 FROM a
SET @xjbyj=''
SET @lm=''
-- 继续使用b_cursor,移到第一行并向职务列名变量@lm赋值
FETCH FIRST FROM b_cursor INTO @lm
-- 判断是否成功
WHILE @@FETCH_STATUS = 0
BEGIN
--更新其他列
SET @xjbyj=@xjbyj+'UPDATE c SET ' + @lm + '= d.姓名 FROM c,'
SET @xjbyj=@xjbyj+' (SELECT a.*,b.学年,b.学期,b.职务 FROM a INNER JOIN b ON a.学号=b.学号) d'
SET @xjbyj=@xjbyj+' WHERE d.职务='''+ @lm + ''' AND c.班级=d.班级 AND d.学年=''2005-2006'''
SET @xjbyj=@xjbyj+' AND d.学期 = 2'
--执行更新c表语句
EXEC (@xjbyj)
--重置,找第二条职务
SET @xjbyj=''
-- 如果成功继续向职务列名变量@lm赋值
FETCH NEXT FROM b_cursor INTO @lm
END
CLOSE b_cursor
DEALLOCATE b_cursor
GO