oracle纵表转横表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle纵表转横表相关的知识,希望对你有一定的参考价值。

a表 b表
id,aname ; id, aid , bname
11 张三 1 11 语文
2 11 数学
3 11 英语
。 11 。。
。 11 。。
62 11 数学
这里b表中的aid为a表中的id,需要显示成

张三,语文,数学,英语 。。。。数学
问题主要是有62个,内容不确定,还能重复。。
需要的就是b表中的bname ,bname 内容是虽然有范围的,但是这里的bname 有可能都是语文,那我就要显示62条语文

参考技术A 一般行列转置,有两种做法
一种是case,但是由于case需要提前知道列数,所以在很多情况下不能满足
所以出现了动态语句case,通过动态SQL语句的组装,实现了动态的列的拼装。但是语句复杂度很高

所以另一种方式就是靠程序转置,使用一些Hash(JAVA)或Dictionary(C#)等一些对象,可以在程序中轻松地做出转置,但是也有缺点,缺点就是开销大,原本只处理一次的数据(只在数据库处理),现在需要处理两次(数据库一次,程序一次)
参考技术B 如果是11g的数据库可以用listagg
10g有wmsys.wm_concat,不过这是个不公开的函数
参考技术C case 可以解决吗?

62个 是表示 有 62 个 bname 吗?追问

怎么用case,比如62条中有13条都是显示成数学的,怎么分开啊

追答

(case when bname = "语文" THEN aid END )

这个方法 要求 (bname + aname ) 不可重复,

Sql的行列转换

创建表scores

一、传统的行列转换

纵表转横表

我们要转成的横表是这样子的:


pivot是sql server 2005 提供的运算符,所以只要数据库在05版本以上的都可以使用。主要用于行和列的转换。

 pivot纵表转横表

select
    t2.姓名,
    t2.数学,
    t2.物理,
    t2.语文
from Scores as t1
pivot (sum(分数) for 课程 in(数学,语文,物理)) as t2

pivot将原来表中 课程字段中的 数据行 数学,语文,物理 转换为列,并用sum取对应列的值。

unpivot 横表转纵表

select
     *
 from
 scores2
 unpivot (分数 for 课程 in (语文,数学,物理)) as t3

 unpivot 将 语文,数学,物理 列转为行,分数为新的一列存放对应的值。

以上是关于oracle纵表转横表的主要内容,如果未能解决你的问题,请参考以下文章

sql 纵表转横表

mysql 纵表转横表,高手请支招

oracle sql 中 如何实现table的行列转换?

SQL横表纵表转换和对比

纵表与横表互转实例

SQL纵表与横表互转