假设有张学生成绩表(tb)如下:
Name Subject Result
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
-------------------------------------------------------------------------
想变成
姓名 语文 数学 物理
---------- ----------- ----------- -----------
李四 74 84 94
张三 74 83 93
create table tb
(
Name varchar2(10) ,
Subject varchar2(10) ,
Result number
);
insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
(case subject when '语文' then result else 0 end) 语文,
(case subject when '数学' then result else 0 end) 数学,
(case subject when '物理' then result else 0 end) 物理
from tb
case的括号前可加数据统计函数,如max,sum等
max(case subject when '语文' then result else 0 end) 语文--语文最高分
sum(case subject when '语文' then result else 0 end) 语文--语文成绩之和(适合竖排有重复列的情况)
--动态SQL,指subject不止语文、数学、物理这三门课程。
create or replace procedure test as
declare @sql varchar2(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql = @sql + ' from tb group by name'
exec(@sql);
加个平均分,总分
--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
max(case subject when '语文' then result else 0 end) 语文,
max(case subject when '数学' then result else 0 end) 数学,
max(case subject when '物理' then result else 0 end) 物理,
cast(avg(result*1.0) as decimal(18,2)) 平均分,
sum(result) 总分
from tb
group by name
--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql1 varchar(8000)
set @sql1 = 'select Name as ' + '姓名'
select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'
exec(@sql1)
drop table tb;
---------------------------------------------------------
--如果上述两表互相换一下:即横排变竖排
姓名 语文 数学 物理
张三 74 83 93
李四 74 84 94
想变成
Name Subject Result
---------- ------- -----------
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
create table tb1
(
姓名 varchar2(10) ,
语文 number ,
数学 number ,
物理 number
);
insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93);
insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94);
select * from
(
select 姓名 as Name ,'语文' , 语文 from tb1
union all
select 姓名 as Name , '数学' ,数学 from tb1
union all
select 姓名 as Name , '物理' , 物理 from tb1
) t
order by name
drop table tb1;
以上在oralce 9i环境下编译通过。
以上是网上找的,但是实际运行是出现了多列,有0的情况,其实SQL语句要这样写的
select name 姓名,
max(case subject when '语文' then result else 0 end) 语文,
max(case subject when '数学' then result else 0 end) 数学,
max(case subject when '物理' then result else 0 end) 物理
from tb group by name;
结果才是这个:
姓名 语文 数学 物理
张三 74 83 93
李四 74 84 94
相关推荐
在易语言中,超级列表框提供了横排和竖排两种显示模式,使得数据的展示更加灵活多样。横排通常用于展示数据的不同列,而竖排则用于展示数据的多个行。源码示例将展示如何根据需求切换这两种模式,以适应不同的用户...
本文将详细介绍如何在SQL Server中进行纵表与横表的相互转换,并提供具体的SQL语句示例。 1. **纵表转横表(Pivot)** 纵表通常拥有大量的行,而列的数量相对较少。在纵表中,每个特定的属性可能分布在多行中。...
3、框架(iframe)和JS两种调用新闻和图片新闻,以及图片新闻的自定义横排和竖排。 4、强大的后台文章编辑器的功能。可方便地用拖动的方式进行图文混排、图片远程上传、上传图片显示效果处理等操作,以及"从word中粘贴...
科汛cms(Kesioncms)是基于采用网络中已经成熟、稳定的技术ASP+ACCESS(SQL2000/2005)开发而成,利用本系统您可以很方便地管理自己的网站。本系统是一款由文章、图片、下载、分类信息、商城、求职招聘、影视、动漫...
在模板导出的过程中,你可以预先设定Excel文件的布局,包括标题、横排字段和竖排字段。标题通常代表数据的不同类别,横排字段表示数据的列名,而竖排字段则是实际的数据行。Npoi允许你在程序中动态填充这些模板,...
支持后台Cookie加密、验证码IP锁定、IP白名单、防SQL注入、防跨站脚本、防脚本文件上传等多重安全机制,并且后台支持按级别访问权限,为网站的安全运营提供最强有力的保障。 7、百度站点地图功能,生成和自动更新...
支持后台Cookie加密、验证码IP锁定、IP白名单、防SQL注入、防跨站脚本、防脚本文件上传等多重安全机制,并且后台支持按级别访问权限,为网站的安全运营提供最强有力的保障。 7、百度站点地图功能,生成和自动更新...
14. 版式更改:如果希望改变幻灯片的排列方式,需要更改幻灯片的版式,例如从横排变为竖排。 15. 动作按钮:在PowerPoint中,动作按钮可以链接到其他幻灯片、文件、网址等多种目标,提供交互性。 16. 计算机系统...