回 帖 发 新 帖 刷新版面

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

这个前一个星期一个朋友发的一道题,那时水平有限没做出来,也看没人接,所以我就接了,今天做出来了,跟大家分享一下!

回复列表 (共3个回复)

沙发

/*不是为了分,只是为了那道题目,我需要的不是一堆虚无的分数
要的只是那 考验自己的 题目
  
    上面那个有问题
下面那个你去运行一下:

  学号为空我没有判断,因为学号是主键

    这个正确

希望下次你再能出一道经典的题目让我做做
太谢谢你了,你让我的SQL SERVER 的运用,有一个质的飞越
*/

-----------测试数据--------------
set nocount on
go
use master
go
if exists(select name from sysdatabases where name='java')
     drop database java

go
create database java
go
use java
go
if exists(select name from sysobjects where name='a')
      drop table a
go
create table a
(
   学号 int,
   姓名 varchar(20),
   班级 varchar(20)
)
go
insert into a values('110','aa','01')
insert into a values('120','bb','02')
insert into a values('130','cc','01')
insert into a values('140','dd','02')
insert into a values('150','3b','01')
go
if exists(select name from sysobjects where name='b')
      drop table b
go
create table b
(
   学号 int,
   学年 varchar(20),
   学期 varchar(20),
   职务 varchar(20)

)
go
insert into b values('110','f','1','班长')
insert into b values('110','f','2','师长')
insert into b values('130','f','1','排长')
insert into b values('140','f','1','军长')
insert into b values('140','f','1','营长')
go
 


go
if exists(select name from sysobjects where name='d')
   drop table d
go
-----获取其列的值,再创建表D---------
declare @sql_sql varchar(2000)
declare @sql varchar(200)
declare @ho varchar(200)
declare @non varchar(320)
declare @kon varchar(200)
declare @decl varchar(8000)
declare @gg varchar(200)
declare @jj varchar(200)
declare @kk varchar(200)
set @sql_sql=' '
set @sql_sql=@sql_sql+'班级'+' '+'varchar(100),'+' '

set @sql='create table d ('
while(1=1)
begin
   select @sql_sql=@sql_sql+职务+' '+'varchar(100),'+' ' from b 
       break
end
set @sql=@sql+@sql_sql+')'
print @sql
exec(@sql)
go
-----------插入数据的控制-------------
declare @a int
declare @k varchar(20)
declare @j varchar(50)
declare @h varchar(50)
declare @o varchar(60)
declare @u int
declare @v varchar(50)
declare @hn varchar(50)
declare @hong varchar(200)
declare @no varchar(40)
declare @ni varchar(10)
DECLARE @VH varchar(15)
DECLARE @BUG INT 
declare @vb int 
declare @trim varchar(5)
set @trim=' '
                    set @vb=0
SET @BUG=0
set @vh=0
set @u=0
set @v=''
set @h=''
set @a=0
set @j=''
set @no=''
--------------获取班级有多少个,其后插入表C-------------
if exists(select * from sysobjects where name='c')
  drop table c

 select distinct 班级 into c from a
   select @k=count(*) from c
----------------------------------------------------------
while(1=1)
begin
--------------将里面那个WHILE循环变量清空,以便插入多条数据---------
set @u=0
set @o=0
set @j=' '
--------------------------------------------------------------------
set @a=@a+1
set @vh=@vh+1  
if(@a<=@k)
begin
SET ROWCOUNT @a       --  这里控制返回的行数
---------------获取班级名-------------------------      
select @h=班级 from c
--------------获取带可插入的班级名------------------
select @ni=''''+班级+'''' from c
--------------开始获取有职务人员姓名----------------
  while(1=1)
   
     begin
  declare @jon varchar(20)
          set @jon=''    
        set @u=@u+1
                select @o=count(职务) from b
            if(@u<=@o)
                  begin                
                   set ROWCOUNT @u          --这里控制返回行数,核心
                    select @hn=学号 from b
------------判断是否有记录,有就加入到字符串,没有加个空格字符串
       select @jon=姓名 from a where 学号=@hn and 班级=@h
        
                      if(@jon!='')                                        
                        select @j=@j+','+''''+姓名+''''from a where 学号=@hn and 班级=@h
        else    
            begin
            if exists(select 姓名 from a where 学号=@hn)    
            set @j=@j+','+''''+@trim+'''' 
            end
                
                  

                    
end
            else
                      
        break
                end

       set @no=@ni+@j
             
      set @hong='insert into d values'+'('+@no+')' 
print '第'+@vh+'次的插入语句'+@hong

------执行--------------
       exec(@hong)
------------------------
      
end

else   
 begin
set ROWCOUNT 0
break
end
end

select * from a
select * from b
select * from d






-----------------------只要你能想的到的问题,编程都能模拟的帮你解决--------------------
-----------------------想看清楚点,就用显示文本--------------------------------





板凳

好的很,尤其对于我们这些初学者. 希望多多发一些类似的帖子 啊!!





[size=50]顶!![/size]





3 楼


你还是初学者?[em10]

我来回复

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