[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的因爲沒有環境研究不了,哪位會的,回覆上來呀!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章