--这个是动态列的例子, --也就是根据你表里面多少列然后产生出来的. drop table class go -->生成测试数据 drop table # go create table CLASS([Class] nvarchar(4),[Student1] nvarchar(1),[Student2] nvarchar(1),[Student3] nvarchar(1)) Insert CLASS ([Class],[Student1],[Student2],[Student3]) select N'数学1班',N'A',N'B',N'C' union all select N'数学2班',N'D',N'Q',N'P' union all select N'英语1班',N'E',N'D',N'H' union all select N'英语2班',N'J',N'K',N'Q' union all select N'历史班',N'A',N'D',N'H' union all select N'政治班',N'A',N'D',N'H' union all select N'专业班',N'J',N'K',N'Q'declare @i int,@cnt int,@sql nvarchar(max) select @cnt = max(column_id) from sys.columns where object_id =object_id(N'CLASS') create table # ([Class] nvarchar(4),[st] nvarchar(1)) select @i=2,@sql=' ' while @i<=@cnt begin if @i >2 select @sql = @sql + ' UNION ALL ' select @i = @i + 1 ,@sql = @sql + ' Select [class],'+[name]+' as st from CLASS ' from sys.columns where object_id =object_id(N'CLASS') and column_id =@i end set @sql = @sql + '' --print @sql insert into # exec(@sql) select @i=1,@cnt=max(cnt),@sql ='' from ( select st,count(1) cnt from # group by st)a while @i <=@cnt begin set @sql = @sql + ', max(case when px='+ltrim(@i)+' then class else '''' end) as class'+ltrim(@i) + ' ' set @i = @i +1 end set @sql = ' select st '+ @sql + ' from ( select px=(select count(1) from # where st=t.st and class<=t.class),* from # t )b group by st' --print @sql exec (@sql) /* st class1 class2 class3 class4 ---- ------ ------ ------ ------ A 历史班 数学1班 政治班 B 数学1班 C 数学1班 D 历史班 数学2班 英语1班 政治班 E 英语1班 H 历史班 英语1班 政治班 J 英语2班 专业班 K 英语2班 专业班 P 数学2班 Q 数学2班 英语2班 专业班 */
借宝地问一下和尚:
求个帖子的地址,好像是说有表
nid sid bank
-----------------
1 1 NULL
2 1 1
...
求取同SID的第一笔不为NULL的记录的?谢谢了。
你设计的表 有问题
才引起了后面一大堆问题你可以把你的需求贴出来,
我们可以帮你的设计你可以先设计一个CLASS 表 保存主要信息
在建立一个CLASS_details保存详细信息这样就可以视线横向分表
这个没关系 你可以在DTS、SSIS时 进行转换转换时选择字段可以先到临时表
还有 班级数到了100 下面的那SLECET语句也要写到100? 就没个省事点的算法?
奇了怪了!
--这个是动态列的例子,
--也就是根据你表里面多少列然后产生出来的.
drop table class
go
-->生成测试数据
drop table #
go
create table CLASS([Class] nvarchar(4),[Student1] nvarchar(1),[Student2] nvarchar(1),[Student3] nvarchar(1))
Insert CLASS ([Class],[Student1],[Student2],[Student3])
select N'数学1班',N'A',N'B',N'C' union all
select N'数学2班',N'D',N'Q',N'P' union all
select N'英语1班',N'E',N'D',N'H' union all
select N'英语2班',N'J',N'K',N'Q' union all
select N'历史班',N'A',N'D',N'H' union all
select N'政治班',N'A',N'D',N'H' union all
select N'专业班',N'J',N'K',N'Q'declare @i int,@cnt int,@sql nvarchar(max)
select @cnt = max(column_id) from sys.columns where object_id =object_id(N'CLASS')
create table # ([Class] nvarchar(4),[st] nvarchar(1))
select @i=2,@sql=' '
while @i<=@cnt
begin
if @i >2 select @sql = @sql + ' UNION ALL '
select @i = @i + 1 ,@sql = @sql + ' Select [class],'+[name]+' as st from CLASS ' from sys.columns where object_id =object_id(N'CLASS') and column_id =@i
end
set @sql = @sql + ''
--print @sql
insert into # exec(@sql) select @i=1,@cnt=max(cnt),@sql ='' from ( select st,count(1) cnt from # group by st)a
while @i <=@cnt
begin
set @sql = @sql + ', max(case when px='+ltrim(@i)+' then class else '''' end) as class'+ltrim(@i) + ' '
set @i = @i +1
end
set @sql = ' select st '+ @sql + ' from ( select px=(select count(1) from # where st=t.st and class<=t.class),* from # t )b group by st'
--print @sql
exec (@sql)
/*
st class1 class2 class3 class4
---- ------ ------ ------ ------
A 历史班 数学1班 政治班
B 数学1班
C 数学1班
D 历史班 数学2班 英语1班 政治班
E 英语1班
H 历史班 英语1班 政治班
J 英语2班 专业班
K 英语2班 专业班
P 数学2班
Q 数学2班 英语2班 专业班
*/