[SQLServer]数据库行列互换

 面试的时候遇到的数据库SQL问题,没写过,然后研究了一下,现将结果记录下来,方便以后查询。
 
题目1:将表tbltest1的行列互换
 
表结构:
student     kemu  fenshu
student1    语文    80
student1    数学    90
student1    英语    85
student2    语文    85
student2    数学    92
student2    英语    82
 
变成:
student  语文    数学   英语
student1   80     90     85
student2   85     92     82
 
SQLserver的sql语句:
declare @sql varchar(4000)  
set @sql = 'select student'  
select @sql = @sql + ',sum(case kemu when ' ''+ kemu + '' ' then fenshu else 0 end)['+ kemu+ ']'
   from ( select distinct kemu from tbltest1) as a  
set @sql = @sql + ' from tbltest1 group by student'  
exec(@sql)
或者
select student, sum( case kemu when '语文' then fenshu else 0 end) 语文, sum( case kemu when '数学' then fenshu else 0 end) 数学, sum( case kemu when '英语' then fenshu else 0 end) 英语 from tbltest group by student
 
注:个人觉得上面的好。如果一两个选项可以使用下面的sql,如果选项多上面的sql就显的方便的多。
 
2005的话好像还有个函数可以用,等研究好了再发上来。
 
题目2:合并
 
表结构tbltest2:
id strings
1   my
1   name
1   is
1   xudayu
2   hello
2   world
 
转化成:
id   strings
 1   my name is xudayu 
 2   hello world 
 
SQLServer的sql语句:
 
--创建一个合并的函数  
create function fliehebin(@id int)  
returns varchar(5000)  
as  
begin  
declare @ str varchar(5000)  
set @ str= ''  
select @ str=@ str + cast(strings as varchar(50)) + ' ' from tbltest2 where id=@id  
set @ str= subString(@ str,1, len(@ str))  
return(@ str)  
end  
go  
--调用自定义函数得到结果
select distinct id,dbo.fliehebin(id) from tbltest2

 

 

 

 =====================================================================

传说通用的, 如下:

 

 

 

 =====================================================================

 

 

Oracle's:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值