回 帖 发 新 帖 刷新版面

主题:对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

回复列表 (共3个回复)

沙发

能不能把你创建的表的语句一起发过来!~~

板凳

我针对你建的表 是 a 表 和 b 表,运行后有班级,和职务 列,但职务列里面的值是空值!~~~ 谢谢哦!~~~

3 楼

a表和b表字段的数据类型如下
a表 学号 int, 姓名 varchar(10), 班级 varchar(5)
b表 学号 int, 学年 varchar(20), 学期 int, 职务 varchar(10)

我来回复

您尚未登录,请登录后再回复。点此登录或注册