本文作者: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

关于竖表转横表的问题相关推荐

  1. oracle使用decode实现竖表转横表 (列转行)

    工作中时长会用到竖表转横表(列转行)例如某商场每天都有营业额,数据库中营业额存储的方式是每天很多比每笔对应不同的消费记录 ,可能有一天的营业额很多 对应的营业额明细就会很多,如果有个需求是要统计每天营 ...

  2. Oracle实现竖表转横表的几种常用方法(行转列)

    有能耗表,记录各个城市水.电.热的能耗情况,表结构如下: 表结构 名称 类型 备注 E_CODE VARCHAR2(10) 城市的CODE E_VALUE NUMBER 能耗值,包括水耗.电耗.热耗 ...

  3. oracle max decode竖表改横表

    1.oracle :max+decode 竖表改横表 展示为 select a.project_id,        max(decode(a.vote_result, '01', a.zaiyi, ...

  4. MySQL中竖表和横表之间的相互转换

    MySQL中竖表和横表之间的相互转换 1.  横表转为竖表 表tb的结构为 表中的数据为 现在要求查询到如下结果 使用的SQL查询语句应该如下: 或者使用下面查询 2.  竖表转为横表 tb2表的结构 ...

  5. 纵表、横表互转的SQL

    纵表.横表互转的SQL By:大志若愚 1.建表: 纵表结构 Table_A  create table Table_A (姓名 varchar(20),课程 varchar(20),成绩 int ) ...

  6. mysql把结果变横表_mysql纵表与横表转换实例

    1.纵表转横表: 纵表结构:Table1 转换后的横表结构: Sql示例代码: 2.横表转纵表: 横表结构: TableA ID      姓名    语文        数学       英语 1  ...

  7. HIVE中纵表转横表

    最近在写hive脚本的时候,遇到一个问题就是,现在存在一个纵表(详细表),如下所示 table T1 id bankname cardname 1 中国银行 金卡 2 中国银行 白金卡 3 建设银行 ...

  8. SQL中纵表、横表互相转换

    1.建表: 纵表结构 Table_A  create table Table_A (姓名 varchar(20),课程 varchar(20),成绩 int ) insert into Table_A ...

  9. excle中把竖表变成横表

    下午的时候整理数据库字段,要求和中文对应.第一行填中文,第二行填表字段,这个表字段可以通过dbeaver复制列名获取,不需要一个一个打,不过由此产生了一个问题:excle表格是横向的,复制的数据是纵向 ...

最新文章

  1. as cast float server sql_SQL-Server(五)T-SQL语言
  2. Android 软键盘的显示和隐藏,这样操作就对了
  3. VC Studio 使用技巧大全(转)
  4. 动态生成一个继承接口的类
  5. c++中new和delete的使用方法
  6. matlab线性拟合和非线性拟合,matlab多元非线性拟合
  7. 怎样去掉a标签的蓝框
  8. 小程序购物车下架商品实时显示,只为更好用户体验!
  9. AutoCAD工程制图 常见命令与注意事项全总结(120例)
  10. vmware虚拟机安装win11系统教程
  11. c语言编程竞赛活动主题,第三届“希望之星”C语言编程大赛系列活动
  12. 解读《西厢记》——基于人脑的句法分析
  13. 弹窗动画PopupWindow
  14. 护眼色RGB的数值及在福昕阅读器上的设置方法
  15. 卷尺精度标准_卷尺的精度为多少mm 卷尺测量误差的原因有哪些
  16. 【A40i-Android7.1】---编译报错:No Jack server running. Try ‘jack-admin start-server
  17. 用Python画大学物理实验曲线
  18. 20210117noteexpress云端数据库经验分享
  19. 博士毕业选择回老家县城大专任教!事业编、副教授待遇、外加几十万安家费......
  20. 网友创作山寨版英文歌曲《上海滩》

热门文章

  1. GridControl 选择列、复选框全选(上)
  2. iis6 配置python CGI
  3. iOS8:把这些七招APP哭
  4. 处理 JavaScript 异步操作的几种方法总结
  5. Android 自定义Switch,仿微信开关键Switch
  6. Cass2008 for CAD2006 安装
  7. maven本地库已经有的包了,如何不下载(linux环境)
  8. WCF Rest Service
  9. java流的应用_Java中I/O流的应用
  10. (JAVA)格式化输出日期