主题:SQL 语句,感兴趣看看!
233238447
[专家分:1350] 发布于 2006-07-17 23:31:00
表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个回复)
沙发
233238447 [专家分:1350] 发布于 2006-07-17 23:56:00
/*不是为了分,只是为了那道题目,我需要的不是一堆虚无的分数
要的只是那 考验自己的 题目
上面那个有问题
下面那个你去运行一下:
学号为空我没有判断,因为学号是主键
这个正确
希望下次你再能出一道经典的题目让我做做
太谢谢你了,你让我的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
-----------------------只要你能想的到的问题,编程都能模拟的帮你解决--------------------
-----------------------想看清楚点,就用显示文本--------------------------------
板凳
SeZhang [专家分:2970] 发布于 2006-07-18 21:04:00
好的很,尤其对于我们这些初学者. 希望多多发一些类似的帖子 啊!!
[size=50]顶!![/size]
3 楼
233238447 [专家分:1350] 发布于 2006-07-19 17:57:00
你还是初学者?[em10]
我来回复