SQL语句实现横排(感谢原作者,以及修改小bug的作者)
有一个表:
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...)
先创建以上的测试数据表
1 if exists(select name from sysobjects where name='tblA' and xtype='U') 2 drop table tblA 3 4 create table tblA( 5 BH char(3) not null, 6 GZLB varchar(3) not null, 7 JE int not null 8 ) 9 go 10 11 insert tblA values('001', 'A', 100) 12 insert tblA values('001', 'B', 150) 13 insert tblA values('001', 'C', 110) 14 insert tblA values('002', 'A', 99) 15 insert tblA values('002', 'B', 180) 16 insert tblA values('002', 'C', 150) 17 insert tblA values('003', 'A', 160) 18 insert tblA values('003', 'B', 170) 19 insert tblA values('003', 'C', 130)
动态sql的实现
1 declare @sql varchar(6000) 2 set @sql = 'select ' 3 --一直在想动态sql语句有什么用,今天算是见识到了,可以把sql语句当字符串(缩了句废话) 4 --下面的语句是给@sql赋值,其实就是拼接字符串,下面的一句@sql赋值语句等效于以下的sql语句 5 -- select sum(case GZLB when 'A' then JE else null end) [A], 6 --sum(case GZLB when 'B' then JE else null end) [B], 7 --sum(case GZLB when 'C' then JE else null end) [C], 8 --所以动态sql可以节省程序员写如以上的重复代码。小小的一段代码,深藏功与名啊。再说一点,...from (select distinct GZLB as GZLB from tblA)中, 9 --(select distinct GZLB as GZLB from tblA)相当于一个表,但是如果要把它当表用,必须给它一个自定义表名,本赋值语句给的是tmp,否则会报错 10 select @sql = @sql +' sum(case GZLB when '''+ GZLB +''' then JE else null end) ['+ GZLB +'],' from (select distinct GZLB as GZLB from tblA) tmp 11 set @sql = substring(@sql, 1, len(@sql)-1) +' from tblA group by BH' 12 exec(@sql)
执行结果如图:
(先说到这,以后补充)
分享技术的奥秘,共同平等的提高。