22,210
社区成员
发帖
与我相关
我的任务
分享
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 王小强 李刚 王小波 李大刚,李刚强,李小刚
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 行)
*/
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
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 王强 王小强 李刚 王小波 李大刚,李小刚,李刚强
*/
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 王强 王小强 李刚 王小波 ,李大刚,李小刚,李刚强
*/
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
动态生成的语句如下: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 王小强 李刚 王小波 李大刚 李刚强 李小刚