|
有一个表: BH GZLB JE ---------------------- 001 A 100 001 B 150 001 C 110 002 A 99 002 B 180 002 C 150 003 A 160 003 B 170 003 C 130 用SQL语句如何将上面的表变成下面横向的排列方式呢。 BH A B C ------------------- 001 100 150 110 002 99 180 150 003 160 170 130 (GZLB 里面的字段是动态的,不是只有A,B,C 可能还有A,B,C,D,E...) --------------------------------------------------------------- if exists(select name from sysobjects where name='tblA' and xtype='U') drop table tblA create table tblA( BH char(3) not null, GZLB varchar(3) not null, JE int not null ) go insert tblA values('001', 'A', 100) insert tblA values('001', 'B', 150) insert tblA values('001', 'C', 110) insert tblA values('002', 'A', 99) insert tblA values('002', 'B', 180) insert tblA values('002', 'C', 150) insert tblA values('003', 'A', 160) insert tblA values('003', 'B', 170) insert tblA values('003', 'C', 130) declare @sql varchar(600) set @sql = 'select' select distinct GZLB as 'GZLB' into tmp from tblA select @sql = @sql +' max(case GZLB when '''+ GZLB +''' then JE else null end) as '''+ GZLB +''',' from tmp set @sql = substring(@sql, 1, len(@sql)-1) +' from tblA group by BH' exec(@sql) --------------------------------------------------------------- 用游标 declare @sqlstr varchar(2000) declare @gzlb select sqlstr='select bh' declare cgzlb cursor for select gzlb from table create table #a (bh char(3)) open cgzlb fetch next from cgzlb into @gzlb while (fetch_status<>-1) begin exec('alter table #a add '+@gzlb +' char(1)') exec('insert into #a (bh,'+@gzlb+' select bh,je from table where gzlb='''+@gzlb+'''') select @sqlstr=@sqlstr+',sum(isnull('+@gzlb+'))' fetch next from cgzlb into @gzlb end close cgzlb deallocate cgzlb select @sqlstr=@sqlstr+' from #a group by bh order by bh execute(@sqlstr) --------------------------------------------------------------- declare @sql varchar(6000) set @sql = 'select ' select @sql = @sql +' sum(case GZLB when '''+ GZLB +''' then JE else null end) ['+ GZLB +'],' from (select distinct GZLB as GZLB from tblA) tmp set @sql = substring(@sql, 1, len(@sql)-1) +' from tblA group by BH' exec(@sql)
|