关于竖表转横表的问题

本文作者:dinya
内容摘要:在开发过程,经常遇到一些将表的显示方式进行转换的需求,我们习惯性称之为竖表到横表的转换,本文通过一个例子来简要说明常见的两种竖表转横表的问题。

本文适宜读者范围:oracle初级,中级

系统环境:

      os:windows 2000 professional (英文版)

oracle:8.1.7.1.0

正文:

在实际的应用中,我们经常遇到需要转换数据显示方式,比如将横表转为竖表,或将竖表转换为横表的情况,如:课程表的显示方式,部门平均工资的排名等情况。下面将将根据两个实例子的需求描述给出两种常见的竖表转横表的解决办法(本例中的数据意思是:一、二、三年级的各科目最高分统计)。

表结构:

create table test_table
(
    grade_id number(8),             --年级:1、一年级,2、二年级,3、三年级
    subject_name varchar2(30),    --科目:包含语文、数学、外语、政治等科目
    max_score number(8)             --最高分
)

表中数据:

sql> select * from test_table;

 grade_id    subject_name                   max_score

        1      语文                                  95

        1      数学                                  98

        2      语文                                  86

        2      数学                                  90

        2      政治                                  87

        3      语文                                  93

        3      数学                                  88

        3      英语                                  88

        3      政治                                  97

9 rows selected.

 

第一种转换方式:

需求描述:查看每个年级在系统中存在的科目信息,并各年级的科目信息按下面的格式显示:

grade_id      subject_name  

         1      语文  数学

    2      语文  数学  政治

     3      语文  数学  英语  政治

分析:在要求得到的结果中,每个年级的科目将变成一条记录,而且每个年级的科目是不固定的。所以考虑写个函数来解决,输入年级信息,使用游标得到该年级的所有科目信息并返回值。

1、建函数:

sql> create or replace function test_fun(p_grade number) return varchar2 as

  2      v_temp varchar2(100):=;

  3      v_out varchar2(500):=;

  4      cursor c is select a.subject_name from test_table a where a.grade_id=p_grade;

  5  begin

  6      open c ;   --打开游标

  7      loop

  8          fetch c into v_temp;

  9          exit when c%notfound;

 10          v_out:=v_out||  ||v_temp;

 11      end loop;

 12      close c;      --关闭游标

 13      return v_out;

 14      exception

 15          when others then

 16              return an error occured;       

 17  end ;

 18  /

function created.

 

sql> create or replace function test_fun(p_grade number) return varchar2 as

  2      v_out varchar2(500):=;

  3      cursor c is select a.subject_name from test_table a where a.grade_id=p_grade;

  4  begin

  5      for v_temp in c loop

  6          v_out:=v_out||  ||v_temp.subject_name;

  7      end loop;       --系统自动关闭游标

  8      return v_out;

  9      exception

 10          when others then

 11              return an error occured;

 12  end ;

 13  /

function created.

 

2、调用函数得到输入结果:

sql> select distinct a.grade_id,test_fun(a.grade_id) subject from test_table a;

 grade_id            subject

1        语文  数学

2         语文  数学  政治

3         语文  数学  英语  政治

 

第二种转换方式:

需求描述:要求将表中的年级、科目及最高的信息按照下表的格式显示,如果该年级没开的课程,则其最高分用0表示:

年级       语文          数学         英语      政治

一年级        95           98            0               0

二年级        86           90            0              87

三年级        93           88           88              97

 

分析:该需求将年级的分数及科目信息由纵向转为横向,这样就要针对每个年级的,对其科目进行判断,存在科目则显示科目的最高分,如果不存在显示0。这时候就考虑到使用decode函数来解决。实现如下:

 select
    decode(t.grade_id,1,一年级,2,二年级,3,三年级) 年级,
    sum(decode(t.subject_name,’语文’,t.max_score,0)) 语文,
    sum(decode(t.subject_name,数学,t.max_score,0)) 数学,
    sum(decode(t.subject_name,英语,t.max_score,0)) 英语,
    sum(decode(t.subject_name,政治,t.max_score,0)) 政治
from
    test_table t
group by
    t.grade_id

 

需要说明的是,在第一种转换方式中写了两个函数,两个函数实现的是同一个需求,所不同的是,两个函数中游标使用方式不同,地一个函数中手动打开游标,循环结束后要求手动关闭。而后一个函数使用for 循环,循环结束后系统自动关闭光标。在第二种转换方式中,使用了decode函数,关于decode的详细用法,请参考oracle函数相关文档。

总  结:

上面的两种转换方式是在开发中经常遇到的情况,在开发中的其他类似的转换都可以参考上面的转换方式,使用decode,nvl等函数进行一些特别的处理即可得到想要的显示方式.
本文你可以在作者的blog上找到,更多内容请登陆作者的blog。

作者blog:  http://blog.csdn.net/dinya2003/
如转载,请保留作者blog信息.
文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

转载于:https://www.cnblogs.com/Godblessyou/archive/2010/07/17/1779621.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机大小端

大端模式   所谓的大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往…

全系光谱完整版

宇宙射线也叫电磁波,其中包含γ射线、X射线、紫外线、可见光、红外线、近红外、远红外,还有无线电和超声波。 无线电波是振荡电路中自由电子作周期性的运动产生的. 红外线、可见光、紫外线是原子外层电子受激发产生的. X射线是原…

cat 几行_迷风花说Cat!Cat因为林教练是好教练回去现实却给了一巴掌

滔博TES前主教练迷风花26日发布了微博,就自己离职、Cat林教练事件以及汤汤纵情转会事件进行了澄清,网友粉丝们在看到教练迷风花发布的微博后,更加了解了很多事情的真相,粉丝们纷纷对教练迷风花送上了祝福,教练迷风花到…

c# equals与==的区别

对于值类型,如果对象的值相等,则相等运算符 () 返回 true,否则返回 false。对于string 以外的引用类型,如果两个对象引用同一个对象,则 返回 true。对于 string 类型, 比较字符串的值。操作比较的是两个变…

linux下C语言中的flock函数用法

表头文件 #include<sys/file.h> 定义函数 int flock(int fd,int operation); 函数说明 flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件&#xff0c;无法锁定文件的某一区域。 参数 operation有下列四种…

c# - C#用fo-dicom对CT图像的PixelData进行处理和转换

转自&#xff1a;c# - C#用fo-dicom对CT图像的PixelData进行处理和转换 - IT工具网 对于某些测试&#xff0c;我试图操纵 PixelData以 dicom 格式存储的 CT 图像的元素&#xff0c;并使用 C# 中的 Fellow Oak Dicom 将其写回文件中。经过一番研究&#xff0c;我发现我想要处理的…

android studio 显示图形_显示服务器实现(一)

在一个多窗口的图形化操作系统中&#xff0c;显示服务器的任务就是组织这些窗口展现给用户。实际的显示服务器有Linux世界基于X11协议的XServer或者Wayland协议的Weston&#xff0c;还有Android里的SurfaceFlinger。但是除了显示&#xff0c;他们同时包含了输入管理&#xff08…

discuzX 帖子 有的图片没输出 [attach]12323[/attach]的解决办法

在pre_forum_post (as p )中&#xff0c;每个帖子都有一个p.attachment字段&#xff0c;这个字段记录了&#xff0c;帖子中有多少张图片&#xff0c;如果为0&#xff0c;则程序不会替换帖子内容(p.message)中的[attach]标签&#xff0c; 在pre_forum_attachment (as a)中&#…

win32 API函数大全

1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束…

如何识别C++编译以后的函数名

C/C语言在编译以后&#xff0c;函数的名字会被编译器修改&#xff0c;改成编译器内部的名字&#xff0c;这个名字会在链接的时候用到。如果用backtrace之类的函数打印堆栈时&#xff0c;显示的就是被编译器修改过的名字&#xff0c;比如说_Z3foov 。 那么这个函数真实的名字是什…

聊聊临时表

什么是临时表临时表与永久表相似&#xff0c;但临时表存储在 tempdb 中&#xff0c;当不再使用时会自动删除。 临时表有两种类型&#xff1a;本地和全局。它们在名称、可见性以 及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头&#xff1b;它们仅对当前的用户连接是…

电脑不能开机维修_MacBook维修 苹果笔记本电脑进水不开机

最近有很多小伙伴来店里&#xff0c;是进水的Macbook苹果笔记本电脑开不开机、黑屏&#xff0c;有很多朋友认为Macbook进水后擦干&#xff0c;只要能开机就没事&#xff0c;实在不开机晾几天就会好了。其实不然。Macbook进水后晾干虽然能开机但有很多后遗症——比如忽然黑屏、反…

Linux Arch目录下处理器体系架构介绍

alpha 处理器 Alpha 处理器最早由美国DEC 公司设计制造&#xff0c;在Compaq &#xff08;康柏&#xff09;公司收购DEC 之后&#xff0c;Alpha 处理器继续得到发展&#xff0c;并且应用于许多高档的Compaq 服务器上&#xff0c;HP &#xff08;惠普&#xff09;收购的Compaq &…

前端和后端的英文_计算机专业的本科生在前端、后端、测试和运维之间该如何选择...

首先&#xff0c;对于计算机专业的同学来说&#xff0c;在选择发展方向的时候往往会遇到一些困惑&#xff0c;当前随着计算机技术体系的不断壮大&#xff0c;计算机领域的岗位分类也越来越细化&#xff0c;而且在新技术的推动下&#xff0c;还在不断出现新的岗位&#xff0c;比…

医学影像后处理技术超详细收藏版(上)

转自&#xff1a;医学影像后处理技术超详细收藏版&#xff08;上&#xff09; 导语&#xff1a; 医学图像后处理是通过综合运用计算机图像处理技术&#xff0c;医学知识&#xff0c;将由各种数字化成像技术所获得的人体信息按照一定的需要在计算机上表现出来&#xff0c;使之…

BulkLoader类使用

BulkLoader提供简单的载入函数&#xff0c;不管要载入的是xml、swf还是声音文件&#xff0c;都只使用同一接口。功能强大&#xff0c;十分推荐。 用法&#xff0c;载入xml文件&#xff1a; var bulkLoader:BulkLoader new BulkLoader(main loading);bulkLoader.add(my_xml_fil…

uboot 详细注释讲解

大多数bootloader都分为stage1和stage2两部分&#xff0c;u-boot也不例外。依赖于CPU体系结构的代码&#xff08;如设备初始化代码等&#xff09;通常都放在stage1且可以用汇编语言来实现&#xff0c;而stage2则通常用C语言来实现&#xff0c;这样可以实现复杂的功能&#xff0…

【转】VTK和ITK中的坐标系统

当我们在处理医学图像和应用时&#xff0c;一个问题就是坐标系统之间的不同。在图像应用中通常有三个坐标系&#xff0c;分别是世界坐标系&#xff0c;解剖坐标系和图像坐标系。 每种坐标系目的不同&#xff0c;呈现数据的方式也不一样。 解剖坐标系由三个平面组成&#xff0c;…

(ZT)在日本市场推广 iPhone 应用的经验

原贴&#xff1a;http://www.cocoachina.com/appstore/market/2010/0728/1942.html 本文作者为 CocoaChina 会员 “lawrencewu”&#xff0c;是一位专攻日本市场的 iPhone 开发者。他的10款 App &#xff08;9个收费&#xff0c;一个免费&#xff09;在9个月的时间里已经取得了…