`

oracle 行转列 经典解决(转)

阅读更多
数据库查询中难免会遇到行列转换的情况,摘列一些较精典的解决方案

--####################################################################
一、采用SQL decode和PL/SQL函数实现
--####################################################################
1、固定列数的行列转换

student subject grade
---------------------------
student1 语文 80
student1 数学 70
student1 英语 60
student2 语文 90
student2 数学 80
student2 英语 100
……
转换为
语文 数学 英语
student1 80 70 60
student2 90 80 100
……
语句如下:
select student,sum(decode(subject,'语文', grade,null)) "语文",
sum(decode(subject,'数学', grade,null)) "数学",
sum(decode(subject,'英语', grade,null)) "英语"
from table
group by student

2、不定列行列转换

c1 c2
--------------
1 我
1 是
1 谁
2 知
2 道
3 不
……
转换为
1 我是谁
2 知道
3 不
这一类型的转换必须借助于PL/SQL来完成,这里给一个例子
CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER)
RETURN VARCHAR2
IS
Col_c2 VARCHAR2(4000);
BEGIN
FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
Col_c2 := Col_c2||cur.c2;
END LOOP;
Col_c2 := rtrim(Col_c2,1);
RETURN Col_c2;
END;
/
SQL> select distinct c1 ,get_c2(c1) cc2 from table;即可
摘录自:http://www.360doc.com/showWeb/0/0/18772.aspx

--####################################################################
二、使用分析函数进行行列转换
--####################################################################
其实使用分析函数进行处理是很好的方式,翻一下Tom的书,将其中的一个例子收录在这里. 比如查询scott.emp表的用户SAL排序信息,可以使用如下查询:

SQL> SELECT deptno, ename,
2         ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY sal DESC) seq
3    FROM emp;

    DEPTNO ENAME             SEQ
---------- ---------- ----------
        10 KING                1
        10 CLARK               2
        10 MILLER              3
        20 SCOTT               1
        20 FORD                2
        20 JONES               3
        20 ADAMS               4
        20 SMITH               5
        30 BLAKE               1
        30 ALLEN               2
        30 TURNER              3
        30 WARD                4
        30 MARTIN              5
        30 JAMES               6

14 rows selected.

再结合其他函数进行一下行列转换:

SQL> select deptno,
  2  max(decode(seq,1,ename,null)) highest,
  3  max(decode(seq,2,ename,null)) second,
  4  max(decode(seq,3,ename,null)) third
  5  from (
  6  select deptno,ename,
  7  row_number() over
  8  (partition by deptno order by sal desc) seq
  9  from emp)
10  where seq <=3 group by deptno
11  /

    DEPTNO HIGHEST    SECOND     THIRD
---------- ---------- ---------- ----------
        10 KING       CLARK      MILLER
        20 SCOTT      FORD       JONES
        30 BLAKE      ALLEN      TURNER
分享到:
评论

相关推荐

    oracle行转列较精典的解决方案

    ### Oracle行转列的经典解决方案 在Oracle数据库管理与开发过程中,经常会遇到需要将数据表中的行数据转换为列数据的情况,这种操作被称为“行转列”或者“行列转换”。行列转换是数据分析、报表生成等场景中非常...

    oracle动态行转列

    本文将深入探讨如何通过Oracle中的存储过程实现动态“行转列”,并结合给定文件的信息,详细解析其工作原理、优点及应用场景。 ### 核心知识点:Oracle动态行转列 #### 1. 存储过程与动态SQL 存储过程是预编译的...

    Oracle行转列(不定列)

    本篇文章将详细探讨Oracle如何实现行转列为列的过程,以及在面对不确定列数时的解决方案。 在传统的SQL查询中,数据通常是以行的形式存储和展示。然而,在某些场景下,我们可能需要将同一类别的数据从多行转换为一...

    oracle 行转列

    ### Oracle 行转列知识点详解 #### 一、Oracle 行转列概念及应用场景 在数据库操作中,经常需要对数据进行格式上的调整以便更好地分析或展示数据。其中,“行转列”是一种常见的数据处理方式,它指的是将原本存储...

    Sql,oracle数据表行转列问题

    SQL行转列问题解决方案 SQL行转列问题是指将行记录转换为列记录的操作。本文将详细讲解SQL行转列问题的解决方案,并提供了一个具体的实例来帮助读者更好地理解该问题。 问题描述 假设我们有一个学生成绩表tb,...

    Oracle的列转行问题

    列转行(Pivot)和行转列(Unpivot)是两种基本操作,可以将数据按照不同的维度进行组织。传统的列转行方法通常涉及`DECODE`或`CASE`函数与聚合函数如`MAX`或`MIN`的结合,但这些方法可能在处理大量数据时对性能造成...

    oracle的列转行问题

    Oracle 列转行问题解决方案 Oracle 数据库中,列转行问题是一个非常传统的话题。在这个问题中,我们需要将行数据转换成不同的列表示,或者将不同的列数据写到同一列的不同行上。这种问题在实际应用中非常常见,如将...

    Oracle实现行转换成列的方法

    在数据库管理中,有时我们需要将数据的...总之,Oracle提供了多种方式来实现行转列,开发者可以根据实际情况选择最合适的解决方案。了解并熟练掌握这些方法,能帮助我们更好地处理复杂的数据结构,提升数据分析的效率。

    oracle通过sql实现字符串转数字oracle函数

    在Oracle数据库中,将字符串转换为数字是一项常见的操作,特别是在处理包含数字的字符串列时,可能需要进行数值计算或按照数值大小进行排序。本篇文章将深入探讨如何在SQL查询中利用Oracle提供的函数来实现这一目标...

    rowtocol.rar_RowToCol_oracle 动态列

    描述中提到的“动态行转不定列”和“自动转换”暗示了这是一个处理不固定数量列的解决方案,而“列数限制为oracle限制”意味着这个方法考虑到了Oracle对最大列数的规定。 Oracle提供了几种方法来实现行转列,其中最...

    Oracle 行迁移与行链接的实验详解

    ### Oracle 行迁移与行链接的实验详解 #### 一、引言 在Oracle数据库管理过程中,行迁移(row migration)与行链接(row chaining)是两种常见的现象,它们通常发生在记录过大或更新操作导致记录扩展超出单个数据块所能...

    oracle查询相邻上下行值

    以上两种方法均可以有效地解决Oracle数据库中查询相邻行的问题。自连接方式适用于任何版本的Oracle数据库,而使用`LAG()`和`LEAD()`函数则更加简洁高效,但需要Oracle 11g及以上版本的支持。具体选择哪种方式取决于...

    oracle某个字段多行记录转化为一行

    此标题明确指出了解决的问题:在Oracle数据库中,如何将特定字段的多行记录合并成一行记录。这种需求通常出现在报告或数据分析的过程中,当需要将多个相关的值组合在一起进行展示或进一步处理时。 ### 描述理解 ...

    Oracle+Weblogic+Server+Java反序列化漏洞 解决方案

    Oracle+Weblogic+Server+Java反序列化漏洞 解决方案 Oracle+Weblogic+Server+Java反序列化漏洞 解决方案

    oracle错误及解决方法

    - **查询文档**:Oracle官方文档(如Oracle Database Error Messages)是查找错误解决方案的重要资源,其中详细解释了每个错误代码的含义和建议的解决策略。 - **检查日志**:分析数据库服务器的日志文件,如alert...

    Oracle数据中心解决方案交流

    Oracle数据中心解决方案交流主要涵盖数据生命周期中的关键环节,包括数据采集与加工、数据存储设计、数据应用、数据管控、数据管理以及数据中心的最佳实践。这些环节构成了一个高效、安全且可扩展的数据中心架构的...

    Oracle数据库中行迁移、行链接的问题

    在Oracle数据库中,行迁移(Row Migration)和行链接(Row Chaining)是两种与数据存储和空间管理紧密相关的现象。这两个概念对于理解和优化数据库性能至关重要。 行迁移是指当一个数据库行在一个分配的块中无法...

    oracle转SQL Server方法收集

    ### Oracle转SQL Server方法详解:运用SSMA工具实现高效迁移 #### 一、引言 随着企业业务的发展和技术栈的变化,数据库迁移成为了一个常见的需求。本文将详细介绍如何使用Microsoft SQL Server Migration ...

    oracle存储过程学习经典入门

    Oracle存储过程的学习经典入门涉及多个核心概念和技术,包括性能调优、数据库分区、分表、读写分离以及主从模式等。以下是对这些知识点的详细说明: 1. **Oracle存储过程**: - 存储过程是一组预先编译的SQL语句和...

Global site tag (gtag.js) - Google Analytics