SQL数据横列变竖列

来源:百度知道 编辑:UC知道 时间:2024/05/20 14:33:38
有一张表里面有三个字段“姓名”“选修科目”“成绩”,结构如下:
姓名 选修科目 成绩
张三 计算机 75
张三 高等数学 80
张三 物理 77
李四 高等数学 55
李四 微积分 87
王五 语文 78
... ... ...
注:选修科目不固定,可选科目很多,只知道每个人可以选修1-5门课程。
希望变成:
姓名 科目1 成绩 科目2 成绩 科目3 成绩 科目4 成绩 科目5
张三 计算机 75 高等数学 80 物理 77
李四 高等数学 55 微积分 87
王五 语文 78
... ... ...
1楼的朋友的答案我看懂了,但是有一点没在问题里说明,就是我看起来不方便,还有就是我要出来到EXCEL的时候不能统计每科的成绩。
2楼朋友的行列转换—普通,我没看明白,放到数据库里运行提示出错了。相应的表名和字段名都改了.希望可以解答下
行列转换—合并和1楼的朋友差不多。
**************************************
再补充WHITE_WIN 朋友
你那个我明白了,但是还有一个问题,因为有的人成绩会作废掉,但是在视图里,序号不会自动往上升,我希望可以网上升,相应的在表里(成绩表) 我会增加一个字段“状态”里面有两种取值“有效”,“无效”。无效的科目成绩我希望可以不显示出来,也就是原来是:【张三 语文 80 数学 90 】,后来语文无效了,可以自动调整为【张三 数学 90】。在你的方法里则会显示为【张三 (放空)(放空)数学 90】

以下方法适用于任意多的科目:
--先建立函数,功能是根据给出的姓名,到表中去查找所选科目及成绩并横向列示出来.
CREATE FUNCTION getcoldata
(@XM VARCHAR(18))
RETURNS varchar(1000)
AS
BEGIN
DECLARE @deli VARCHAR(2)
set @deli=' '
declare @f1 varchar(100),@F2 DECIMAL(12,1),@result varchar(1000),@sn0 int
set @result=''
declare ddcursor cursor for select 选修科目,成绩 from 表名 where 姓名=@XM order by 选修科目
open ddcursor
fetch next from ddcursor into @f1,@F2
while @@fetch_status!=-1
begin
set @result=@result+@deli+isnull(@f1,'')+':'+ISNULL(CONVERT(VARCHAR,@F2),'')
fetch next from ddcursor into @f1,@F2
end
close ddcursor
deallocate ddcursor
return (@result)
end

GO

--使用方法:
select 姓名,科目及成绩=dbo.getcoldata(姓名) from (SELECT DISTINCT 姓名 from 表名) a

结果是这样的
姓名 科目与成绩
张三 计算机:75 高等数学:80 物理:77
李四 高等数学:55 微积分:87
王五 语文:78

==