面試的時候遇到的數據庫SQL問題,沒寫過,然後研究了一下,現將結果記錄下來,方便以後查詢。
題目1:將表tbltest1的行列互換
表結構:
student kemu fenshu
student1 語文 80
student1 數學 90
student1 英語 85
student2 語文 85
student2 數學 92
student2 英語 82
student1 語文 80
student1 數學 90
student1 英語 85
student2 語文 85
student2 數學 92
student2 英語 82
變成:
student 語文 數學 英語
student1 80 90 85
student2 85 92 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)
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 my
1 name
1 is
1 xudayu
2 hello
2 world
2 hello
2 world
轉化成:
id strings
1 my name is xudayu
2 hello 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
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的因爲沒有環境研究不了,哪位會的,回覆上來呀!