如何用存储过程实现??

gycgjy 2007-12-18 01:42:54
现有两个表:
主表Teacher:
字段名: TeacherID TeacherName
内容: 123456 王强
... ...

子表Student:
字段名: StudentID TeacherID StudentName Sequence
内容: 123456001 123456 王小强 NO1
123456002 123456 王小波 NO3
123456003 123456 李刚 NO2
123456004 123456 李大刚 NO4
123456005 123456 李小刚 NO6
123456006 123456 李刚强 NO5
... ... .... ...
两个表中有主表有几千条记录,子表有几万条记录.
如何用存储过程实现下面的结果:

结果:
TeacherID TeacherName Student1,Student2,Student3,Student4
123456 王强 王小强 李刚 王小波 李大刚,李刚强,李小刚
...全文
96 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2007-12-18
  • 打赏
  • 举报
回复
下午有事走开:
--前三条记录分开显示,最后一条记录显示为一行,举个例子给楼主,也可以实现三条记录一条这样的显示,楼主改一下字符的生成规则就行了。。。
create table Teacher(  TeacherID int,    TeacherName    nvarchar(20)  ) 
insert Teacher select 123456, '王强'
go


create table Student(StudentID int, TeacherID int, StudentName nvarchar(20) , [Sequence] nvarchar(10))
insert Student select 123456001, 123456, '王小强', 'NO1'
insert Student select 123456002, 123456, '王小波', 'NO3'
insert Student select 123456003, 123456, '李刚', 'NO2'
insert Student select 123456004, 123456, '李大刚', 'NO4'
insert Student select 123456005, 123456, '李小刚', 'NO6'
insert Student select 123456006, 123456, '李刚强', 'NO5'

go

declare @s nvarchar(4000),@i int,@j int
select
@i=max(con)
from
(select count(1) as con from Student group by TeacherID)T
select @j=1

while @j!>@i
select @s=isnull(@s+',','')+case when @j<5 then '[StudentName'+rtrim(@j)+']=max(case when con='+rtrim(@j)+' then StudentName else '''' end)'
else '+'',''+max(case when con='+rtrim(@j)+' then StudentName else '''' end)' end,@j=@j+1
set @s =replace(@s,',+','+')


exec('select t2.TeacherID,'+@s+
'from (select *,con=(select count(1) from Student where TeacherID=a.TeacherID and [Sequence]!>a.[Sequence])from Student a)
TT join Teacher t2 on tt.TeacherID=t2.TeacherID
group by t2.TeacherID,t2.TeacherName')


TeacherID StudentName1 StudentName2 StudentName3 StudentName4
----------- -------------------- -------------------- -------------------- --------------------------------------------------------------
123456 王小强 李刚 王小波 李大刚,李刚强,李小刚

chuifengde 2007-12-18
  • 打赏
  • 举报
回复
create table Teacher(TeacherID varchar(20),TeacherName varchar(20))
insert Teacher select '123456','王强'
insert Teacher select '123457','王刚'

create table Student(StudentID varchar(20),TeacherID varchar(20),StudentName varchar(20),Sequence varchar(20))
insert Student select '123456001','123456','王小强','NO1'
union all select '123456002','123456','王小波','NO3'
union all select '123456003','123456','李刚','NO2'
union all select '123456004','123456','李大刚','NO4'
union all select '123456005','123456','李小刚','NO6'
union all select '123456006','123456','李刚强','NO5'
union all insert student select '123456007','123457','李强','NO1'

create function getStudent(@Tid varchar(20))
returns varchar(200)
as
begin
declare @sql varchar(200)
select @sql=isnull(@sql+',','')+studentname from
(
select top 100 percent StudentName from Student
where TeacherID=@Tid and cast(replace(Sequence,'NO','') as int)>3
order by cast(replace(Sequence,'NO','') as int)
)aa
return @sql
end

go
select a.TeacherID ,a.TeacherName ,b.*
from Teacher a,
(select TeacherID,
Student1=max(case when Sequence='NO1' then StudentName else '' end),
Student2=max(case when Sequence='NO2' then StudentName else '' end),
Student3=max(case when Sequence='NO3' then StudentName else '' end),
Student4=isnull(dbo.getStudent(TeacherID),'') from Student group by TeacherID
)b
where a.TeacherID=b.TeacherID

--result
/*TeacherID TeacherName TeacherID Student1 Student2 Student3 Student4
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
123456 王强 123456 王小强 李刚 王小波 李大刚,李刚强,李小刚
123457 王刚 123457 李强

(所影响的行数为 2 行)
*/
-狙击手- 2007-12-18
  • 打赏
  • 举报
回复
/*

TeacherID TeacherName student1 student2 student3 student4
----------- ----------- ---------- ---------- ---------- ----------------------------------------------------------------------------------------------------
123456 王强 王小强 李刚 王小波 李大刚,李小刚,李刚强


*/
-狙击手- 2007-12-18
  • 打赏
  • 举报
回复
中国风,楼主是想把大于NO3的最后显示成一行
中国风 2007-12-18
  • 打赏
  • 举报
回复
select
t2.TeacherID,
[StudentName1]=max(case when con=1 then StudentName else '' end),
[StudentName2]=max(case when con=2 then StudentName else '' end),
[StudentName3]=max(case when con=3 then StudentName else '' end),
[StudentName4]=max(case when con=4 then StudentName else '' end)+','+max(case when con=5 then StudentName else '' end)+','+max(case when con=6 then StudentName else '' end)

from (select *,con=(select count(1) from Student where TeacherID=a.TeacherID and [Sequence]!>a.[Sequence])from Student a)
TT join Teacher t2 on tt.TeacherID=t2.TeacherID
group by t2.TeacherID,t2.TeacherName

--这样显示?
中国风 2007-12-18
  • 打赏
  • 举报
回复
create table Teacher(  TeacherID int,    TeacherName    nvarchar(20)  ) 
insert Teacher select 123456, '王强'
go


create table Student(StudentID int, TeacherID int, StudentName nvarchar(20) , [Sequence] nvarchar(10))
insert Student select 123456001, 123456, '王小强', 'NO1'
insert Student select 123456002, 123456, '王小波', 'NO3'
insert Student select 123456003, 123456, '李刚', 'NO2'
insert Student select 123456004, 123456, '李大刚', 'NO4'
insert Student select 123456005, 123456, '李小刚', 'NO6'
insert Student select 123456006, 123456, '李刚强', 'NO5'

go

declare @s nvarchar(4000),@i int
select
@i=max(con)
from
(select count(1) as con from Student group by TeacherID)T
set @s=''

while @i>0
select @s='[StudentName'+rtrim(@i)+']=max(case when con='+rtrim(@i)+' then StudentName else '''' end),'
+@s,@i=@i-1
set @s=left(@s,len(@s)-1)

exec('select t2.TeacherID,'+@s+
'from (select *,con=(select count(1) from Student where TeacherID=a.TeacherID and [Sequence]!>a.[Sequence])from Student a)
TT join Teacher t2 on tt.TeacherID=t2.TeacherID
group by t2.TeacherID,t2.TeacherName')



TeacherID StudentName1 StudentName2 StudentName3 StudentName4 StudentName5 StudentName6
----------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
123456 王小强 李刚 王小波 李大刚 李刚强 李小刚

select t2.TeacherID,[StudentName1]=max(case when con=1 then StudentName else '' end),[StudentName2]=max(case when con=2 then StudentName else '' end),[StudentName3]=max(case when con=3 then StudentName else '' end),[StudentName4]=max(case when con=4 then StudentName else '' end),[StudentName5]=max(case when con=5 then StudentName else '' end),[StudentName6]=max(case when con=6 then StudentName else '' end)from (select *,con=(select count(1) from Student where TeacherID=a.TeacherID and [Sequence]!>a.[Sequence])from Student a)
TT join Teacher t2 on tt.TeacherID=t2.TeacherID
group by t2.TeacherID,t2.TeacherName
-狙击手- 2007-12-18
  • 打赏
  • 举报
回复
create table Teacher(TeacherID int,TeacherName varchar(10))
insert into teacher select 123456,'王强'
create table Student(StudentID int,TeacherID int,StudentName varchar(10),[Sequence] varchar(4))
insert into student select 123456001,123456 ,'王小强','NO1'
insert into student select 123456002,123456 ,'王小波','NO3'
insert into student select 123456003,123456 ,'李刚','NO2'
insert into student select 123456004,123456 ,'李大刚','NO4'
insert into student select 123456005,123456 ,'李小刚','NO6'
insert into student select 123456006,123456 ,'李刚强','NO5'
go

create function f_str(@teacher int)
returns varchar(100)
as
begin
declare @s varchar(8000)
select @s = ''
select @s = @s + ','+studentname from student where cast(substring([Sequence],3,10) as int) > 3
set @s = stuff(@s,1,1,'')
return @s

end
go

declare @sql varchar(8000)
set @sql = 'select a.TeacherID,a.TeacherName '

select @sql = @sql
+ ',[student'+ltrim(N)+']= max(case when [Sequence] = ''NO'+ltrim(N)+''' then b.StudentName else '''' end)'
from (select 1 as N union select 2 union select 3) aa

exec ( @sql+' ,dbo.f_str(a.TeacherID) as student4 from teacher a
left join student b
on a.TeacherID = b.TeacherID
group by a.TeacherID,a.TeacherName')



drop table student,teacher
drop function f_str

/*

TeacherID TeacherName student1 student2 student3 student4
----------- ----------- ---------- ---------- ---------- ----------------------------------------------------------------------------------------------------
123456 王强 王小强 李刚 王小波 李大刚,李小刚,李刚强


*/
-狙击手- 2007-12-18
  • 打赏
  • 举报
回复
create table Teacher(TeacherID int,TeacherName varchar(10))
insert into teacher select 123456,'王强'
create table Student(StudentID int,TeacherID int,StudentName varchar(10),[Sequence] varchar(4))
insert into student select 123456001,123456 ,'王小强','NO1'
insert into student select 123456002,123456 ,'王小波','NO3'
insert into student select 123456003,123456 ,'李刚','NO2'
insert into student select 123456004,123456 ,'李大刚','NO4'
insert into student select 123456005,123456 ,'李小刚','NO6'
insert into student select 123456006,123456 ,'李刚强','NO5'
go

create function f_str(@teacher int)
returns varchar(100)
as
begin
declare @s varchar(8000)
select @s = ''
select @s = @s + ','+studentname from student where cast(substring([Sequence],3,10) as int) > 3
return @s

end
go

declare @sql varchar(8000)
set @sql = 'select a.TeacherID,a.TeacherName '

select @sql = @sql
+ ',[student'+ltrim(N)+']= max(case when [Sequence] = ''NO'+ltrim(N)+''' then b.StudentName else '''' end)'
from (select 1 as N union select 2 union select 3) aa

exec ( @sql+' ,dbo.f_str(a.TeacherID) as student4 from teacher a
left join student b
on a.TeacherID = b.TeacherID
group by a.TeacherID,a.TeacherName')



drop table student,teacher
drop function f_str

/*

TeacherID TeacherName student1 student2 student3 student4
----------- ----------- ---------- ---------- ---------- ----------------------------------------------------------------------------------------------------
123456 王强 王小强 李刚 王小波 ,李大刚,李小刚,李刚强


*/
中国风 2007-12-18
  • 打赏
  • 举报
回复
动态生成的语句如上..
复制到下面去了 Sequence有大小顺序时,可以这个实现
中国风 2007-12-18
  • 打赏
  • 举报
回复
select TeacherID,[StudentName1]=max(case when con=1 then StudentName else '' end),[StudentName2]=max(case when con=2 then StudentName else '' end),[StudentName3]=max(case when con=3 then StudentName else '' end),[StudentName4]=max(case when con=4 then StudentName else '' end),[StudentName5]=max(case when con=5 then StudentName else '' end),[StudentName6]=max(case when con=6 then StudentName else '' end)from (select *,con=(select count(1) from Student where TeacherID=a.TeacherID and [Sequence]!>a.[Sequence])from Student a)
TT group by TeacherID
动态生成的语句如下:
中国风 2007-12-18
  • 打赏
  • 举报
回复
create table Student(StudentID int,   TeacherID int,    StudentName nvarchar(20) ,    [Sequence] nvarchar(10))
insert Student select 123456001, 123456, '王小强', 'NO1'
insert Student select 123456002, 123456, '王小波', 'NO3'
insert Student select 123456003, 123456, '李刚', 'NO2'
insert Student select 123456004, 123456, '李大刚', 'NO4'
insert Student select 123456005, 123456, '李小刚', 'NO6'
insert Student select 123456006, 123456, '李刚强', 'NO5'

go

declare @s nvarchar(4000),@i int
select
@i=max(con)
from
(select count(1) as con from Student group by TeacherID)T
set @s=''

while @i>0
select @s='[StudentName'+rtrim(@i)+']=max(case when con='+rtrim(@i)+' then StudentName else '''' end),'
+@s,@i=@i-1
set @s=left(@s,len(@s)-1)

exec('select TeacherID,'+@s+
'from (select *,con=(select count(1) from Student where TeacherID=a.TeacherID and [Sequence]!>a.[Sequence])from Student a)
TT group by TeacherID')

TeacherID StudentName1 StudentName2 StudentName3 StudentName4 StudentName5 StudentName6
----------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
123456 王小强 李刚 王小波 李大刚 李刚强 李小刚

gycgjy 2007-12-18
  • 打赏
  • 举报
回复
我要的结果中不是简单的将行转换成列,我想要的是有顺序的。
排名第一的学生放在Studet1中,排名第二的学生放在Student2中,但排名第二的学生在子表中是不一定是第二条记录
gycgjy 2007-12-18
  • 打赏
  • 举报
回复
我用的就是 sql server 2005
gycgjy 2007-12-18
  • 打赏
  • 举报
回复
我想要的结果是:


TeacherID TeacherName Student1 Student2 Student3 Student4
123456 王强 王小强 李刚 王小波 李大刚,李刚强,李小刚
中国风 2007-12-18
  • 打赏
  • 举报
回复
2000需要用函数,05可用pivot
-狙击手- 2007-12-18
  • 打赏
  • 举报
回复
动态SQL + 函数
toddzst 2007-12-18
  • 打赏
  • 举报
回复
动态SQL,行列转换,你查下这方面的

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧