[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
 
Mysql没研究,其他数据库,如Oracle的因为没有环境研究不了,哪位会的,回复上来呀!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章