微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

[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:

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐