表中数据的行转列

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/archive/2011/08/17/2141692.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值