先建个简单的临时表:
IF OBJECT_ID('TEMPDB..#lsb1') IS NOT NULL DROP TABLE #lsb1
create table #lsb1
(
a1 VARCHAR(50),
a2 varchar(50),
a3 varchar(50)
)
insert into #lsb1 values('张三','90','数学')
insert into #lsb1 values('张三','85','语文')
insert into #lsb1 values('张三','82','物理')
insert into #lsb1 values('李四','95','数学')
insert into #lsb1 values('李四','90','语文')
insert into #lsb1 values('李四','85','物理')
行转列1:
会将各字段合并输出,不算严格意义上的行转列,比较适合数据的传输、转json等方式
select STUFF((select ','+a1+'|'+a2+'|'+a3 from #LSB1 FOR XML PATH(''),type).value('.','NVARCHAR(MAX)'),1,1,'')
行转列2:
要有固定的值域,将a3作为列名(a3要有固定值域),a2作为a3列的值
select * from #LSB1
PIVOT (max(a2) FOR a3 IN ([数学],[语文],[物理])) a
总结:
这两种平时用的较多,各有优点