以下方法适用于任意多的科目:
--先建立函数,功能是根据给出的姓名,到表中去查找所选科目及成绩并横向列示出来.
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 姓名,科目及成绩=dbogetcoldata(姓名) from (SELECT DISTINCT 姓名 from 表名) a
结果是这样的
姓名 科目与成绩
张三 计算机:75 高等数学:80 物理:77
李四 高等数学:55 微积分:87
王五 语文:78
=============
我这么看您的问题:
1.查询是用来输出的,不是用来统计的:您的这种结果即使用分开字段也是很不容易统计的,要想统计还是原表比较方便.
就是说:这种查询结果更方便输出\查看,原表更方便于作统计.
所以,我劝您,比较科学的作法是保留原表,可以方便的作出包括本查询在内的各种查询.而您如果只保留查询后的表,即使用字段是分开的,那么将很难再作其它统计和查询.因为数据太不规范.
2.可以输出各门分开的EXCEL表:如果您想输出到EXCEL表,您要以把函数中的分隔符改成逗点或制表符(CHAR(9)),直接存成CSV或XLS文档就成了.
3.完全按照您的结果也能输出.但今天我没空了,给你个提示:
先看看我以前的回答中,有一些是关于加序号的,加上序号后就好说了.
===========
加到200分,我就开始为您作分开字段的查询.(办法我知道,但是很麻烦啊)
===============================================
与您的要求完全相同的查询:
为了清楚,先建立一个查询,给每人的科目加序号,如果不理解,执行一下SELECT FROM MYVIEWNAME就知道了:
=====================
视图改一下:
create view myviewname
as
select 姓名,科目,成绩,序号=(select count(1) from tablename a where a姓名=b姓名 and a科目>=b科目) from
(select from tablename where 状态='有效') --以子查询替换了TABLENAME,够直观吧?
b --视图加上了序号字段
go
然后,这就是您要的查询,根据每人所选科目的最大数,可以无限向后延伸,加入科目6,科目7等:
select a姓名,
科目1=isnull(t1科目,''),
成绩1=isnull(t1成绩,''),
科目2=isnull(t2科目,''),
成绩2=isnull(t2成绩,''),
科目3=isnull(t3科目,''),
成绩3=isnull(t3成绩,''),
科目4=isnull(t4科目,''),
成绩4=isnull(t4成绩,''),
科目5=isnull(t5科目,''),
成绩5=isnull(t5成绩,'')
from (SELECT DISTINCT 姓名 from tablename) a
left join myviewname t1 on t1姓名=a姓名 and t1序号=1
left join myviewname t2 on t2姓名=a姓名 and t2序号=2
left join myviewname t3 on t3姓名=a姓名 and t3序号=3
left join myviewname t4 on t4姓名=a姓名 and t4序号=4
left join myviewname t5 on t5姓名=a姓名 and t5序号=5
好了,加到200分再选择正确答案!
以上就是关于SQL数据横列变竖列全部的内容,包括:SQL数据横列变竖列、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)