天天看點

[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的因為沒有環境研究不了,哪位會的,回複上來呀!