SQL 如何查询时竖着的数据横着显示

今天建表的时候遇到一些问题,百度了,也想了一些,总结一下。

  • 姓名 科目 分数
    王明 数学 100
    王明 语文 100
    王明 英语 100

显示成

姓名 数学 语文 英语
王明 100 100 100

select * from sysobjects where [xtype]='u'  
go  

if exists(select id from sysobjects where name='studentscore')  
drop table studentscore--删除与实验冲突的表  
go  
create table studentscore--创建实验表  
(  
[id] int identity(1,1),  
[name] nvarchar(20) not null,  
subject nvarchar(20) not null,  
score int not null  
)  
go  

select * from studentscore  
go  

--添加实验数据  
insert studentscore values ('张三','语文','60');  
insert studentscore values ('张三','数学','65');  
insert studentscore values ('张三','外语','70');  
insert studentscore values ('李四','语文','80');  
insert studentscore values ('李四','数学','90');  
insert studentscore values ('李四','外语','85');  
insert studentscore values ('王五','语文','70');  
insert studentscore values ('王五','数学','71');  
insert studentscore values ('王五','外语','75');  
insert studentscore values ('赵六','语文','64');  
insert studentscore values ('赵六','数学','67');  
insert studentscore values ('赵六','外语','76');  
go  
select * from studentscore  
go  

我们先利用case when then else end 语句将行转为列:  

select [name],语文=case when subject='语文' then score else 0 end from studentscore group by [name],subject,score  

这里为了好理解只取一列,得到下面的结果  

有了语文成绩行专列的例子后,我们很容易将其他两列也添加进来,  

select [name],  
语文=case   
when subject='语文' then score else 0  
end,  
数学=case   
when subject='数学' then score else 0  
end,  
外语=case   
when subject='外语' then score else 0  
end  
from studentscore  
group by [name],subject,score  

下面是查询后的结果:  

现在只要把name相同的行合并到一起就ok了,  

select [name],  
语文=max(case   
when subject='语文' then score else 0  
end),  
数学=max(case   
when subject='数学' then score else 0  
end),  
外语=max(case   
when subject='外语' then score else 0  
end)  
from studentscore  
group by [name]  

好了,看看结果吧.  



上面是列数可枚举时的代码,很多情况下到底有多少列是动态的或者不可知的.  

这个时候需要拼下SQL语句了.  

declare @sql varchar(8000)  

set @sql = 'select [name],'  
select @sql = @sql + 'sum(case subject when '''+subject+'''   
then score else 0 end) as '''+subject+''','  
from (select distinct subject from studentscore) as a   
select @sql = left(@sql,len(@sql)-1) + ' from studentscore group by [name]'  
exec(@sql)  

这里写图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值