表中数据的行转列

use master

go

 

if exists(select name from sys.databases where name='Data')

drop database Data

go

 

create database Data

go

 

use Data

go

 

if exists(select name from sys.objects where name='studentOne')

drop table studentOne

go

 

create table studentOne

(

    studentName nvarchar( 10 ),

    studentSubject  nvarchar( 10 ),

    result int

)

go

 

insert into studentOne(studentName,studentSubject,result) values(' 张三' , ' 语文' , 80)

insert into studentOne(studentName,studentSubject,result) values(' 张三' , ' 数学' , 90 )

insert into studentOne(studentName,studentSubject,result) values(' 张三' , ' 物理' , 85)

insert into studentOne(studentName,studentSubject,result) values( ' 李四' , ' 语文' , 85)

insert into studentOne(studentName,studentSubject,result) values(' 李四' , ' 数学' , 92 )

insert into studentOne(studentName,studentSubject,result) values( ' 李四' , ' 物理' , 82)

insert into studentOne(studentName,studentSubject,result) values(' 李四' , ' 化学' , 82)

go

 

select * from studentOne

go

 

---------------------------

--行转列

---------------------------

--步骤一:

select studentName from studentOne group by studentName

 

--步骤二:

select studentName,max(case when studentSubject='语文' then result end) as '语文' from studentOne group by studentName

--步骤三:

select studentName,isnull(sum(case when studentSubject='语文' then result end),0) as '语文' from studentOne group by studentName

 

--解释:

/*

按照上面的三个步骤分别看一下是什么结果

解释第二句:按照语文这个条件找,找到相对应的分数

可以看出值都是null这个时候就要用到isnull将值进行转换(转成)

 

*/

 

declare @sql varchar(4000)

set @sql=' select studentName '

select @sql= @sql+' ,isnull(max(case studentSubject when ''' +studentSubject+ ''' then result end),0) ['+studentSubject+']'

from (select distinct studentSubject from studentOne) as temp

select @sql=@sql+' from studentOne group by studentName'

print @sql

exec (@sql)

 

---------------------------

--列转行

---------------------------

if exists(select name from sys.objects where name='studentTwo')

drop table studentTwo

go

 

create table studentTwo

(

    studentName nvarchar( 10 ),

    化学 int ,

    数学 int ,

    物理 int  ,

    语文 int

)

go

 

insert into studentTwo(studentName,化学,数学,物理,语文) values(' 李四' , 82 , 92 , 82 , 85)

insert into studentTwo(studentName,化学,数学,物理,语文) values(' 张三' , 0 , 90 , 85 , 80 )

go

 

select * from studentTwo

go

 

select '李四' as studentName,studentName='化学',化学 as  result from studentTwo where studentName='李四'

union all

select '李四' as studentName,studentName='数学',数学 as  result from studentTwo where studentName='李四'

union all

select '李四' as studentName,studentName='物理',物理 as  result from studentTwo where studentName='李四'

union all

select '李四' as studentName,studentName='语文',语文 as  result from studentTwo where studentName='李四'

union all

select '张三' as studentName,studentName='化学',化学 as  result from studentTwo where studentName='张三'

union all

select '张三' as studentName,studentName='数学',数学 as  result from studentTwo where studentName='张三'

union all

select '张三' as studentName,studentName='物理',物理 as  result from studentTwo where studentName='张三'

union all

select '张三' as studentName,studentName='语文',语文 as  result from studentTwo where studentName='张三'

go

 

declare @sql varchar(4000)

set @sql=''

select @sql=@sql+' select '''+studentName+''' as studentName,studentName=''化学'',化学as result from studentTwo where studentName='''+studentName+'''

union all

 

select '''+studentName+''' as  studentName,studentName=''数学'',数学as result from studentTwo where studentName='''+studentName+'''

union all

 

select '''+studentName+''' as  studentName,studentName=''物理'',物理as result from studentTwo where studentName='''+studentName+'''

union all

 

select '''+studentName+''' as  studentName,studentName=''语文'',语文as result from studentTwo where studentName='''+studentName+'''

union all'

 

from (select studentName from studentTwo) as temp

select @sql=left(@sql,len(@sql)-10)

 

print @sql

execute (@sql)

 

 

原文地址:https://www.cnblogs.com/meroselove/p/2141692.html