天天看点

[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的因为没有环境研究不了,哪位会的,回复上来呀!

本文转自xudayu 51CTO博客,原文链接:http://blog.51cto.com/xudayu/84355,如需转载请自行联系原作者