当前位置:Gxlcms > mysql > [SQLServer]数据库行列互换

[SQLServer]数据库行列互换

时间:2021-07-01 10:21:17 帮助过:13人阅读

面试的时候遇到的数据库SQL问题,没写过,然后研究了一下,现将结果记录下来,方便以后查询。 题目1:将表tbltest1的行列互换 表结构: student kemu fenshu student1 语文 80 student1 数学 90 student1 英语 85 student2 语文 85 student2 数学 92 student

面试的时候遇到的数据库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

=====================================================================

传说通用的, 如下:

=====================================================================

Oracle's:

人气教程排行