`

oracle 行转列

阅读更多

1.首先建表如下:

create table TEST_LINE_TO_COL(ID NUMBER,NAME NVARCHAR2(50),COURSE NVARCHAR2(20),SCORE  NUMBER);

insert into TEST_LINE_TO_COL (ID, NAME, COURSE, SCORE)
values (1, '张三', '语文', 65);
insert into TEST_LINE_TO_COL (ID, NAME, COURSE, SCORE)
values (2, '张三', '数学', 85);
insert into TEST_LINE_TO_COL (ID, NAME, COURSE, SCORE)
values (3, '张三', '英语', 95);
insert into TEST_LINE_TO_COL (ID, NAME, COURSE, SCORE)
values (4, '李四', '语文', 85);
insert into TEST_LINE_TO_COL (ID, NAME, COURSE, SCORE)
values (5, '李四', '数学', 95);
insert into TEST_LINE_TO_COL (ID, NAME, COURSE, SCORE)
values (6, '李四', '英语', 75);
insert into TEST_LINE_TO_COL (ID, NAME, COURSE, SCORE)
values (7, '王五', '语文', 55);
insert into TEST_LINE_TO_COL (ID, NAME, COURSE, SCORE)
values (8, '王五', '数学', 90);
insert into TEST_LINE_TO_COL (ID, NAME, COURSE, SCORE)
values (9, '王五', '英语', 75);


2.11g版本前转换语句如下:

select name,
       sum(decode(course, '语文', score)),
       sum(decode(course, '数学', score)),
       sum(decode(course, '英语', score))
  from TEST_LINE_TO_COL
 group by name;


 

3.11g版本新增pivot(行转列),unpivot(列转行)函数

with t as
 (select name, course, score from test_line_to_col)
select * from t pivot (sum(score) for course in('语文', '数学', '英语'));


顺便在这里说下unpivot的用法:

create table a  
select name,
       sum(decode(course, '语文', score)) 语文,
       sum(decode(course, '数学', score)) 数学,
       sum(decode(course, '英语', score)) 英语
  from TEST_LINE_TO_COL
 group by name;
 select * from a;

结果集如下:

用unpivot,把列转化为行

 select *
   from (select name, course, score
           from a unpivot(score for course in(语文, 数学, 英语)));

 

 注意:unpivot(score for course in(语文,数学,英语))中,语文等不能用单引号;score,course是我们新命名的列,也可以是其它,如val,col,所以select name,后自然要跟我们新的列名。

 

4.Listagg函数,在11gR2版本中引入

Listagg函数在进行字符串处理时很用,这个分析函数提供了将来自多个行中的列值转化为列表格式的能力。

 

语法:Listagg(string,separator) within group(order-by-clause) over(partition-by-clause)

 

具体用法:

select name, listagg(score, ',') within group(order by score)
  from TEST_LINE_TO_COL
 group by name;

 

 

 

 

将10小时内的数据进行转列

select user_id,
       wenxin_id,
       listagg(auction_name, ',') within group(order by auction_name) auction_ids
  from (select *
          FROM auction_reminds
         where ceil(((end_at - sysdate) * 24)) <= 10
           and is_remind = '0')
 group by user_id, wenxin_id;

 

  • 大小: 23.1 KB
  • 大小: 19.9 KB
  • 大小: 19 KB
  • 大小: 34.2 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    oracle行转列

    "Oracle行转列"是数据库查询中常见的一种需求,尤其是在数据分析和报表展示时。这个主题涉及到Oracle数据库中的聚合函数、分析函数以及一些高级SQL技巧。 首先,"行转列"的基本思想是将数据库表中的一列数据转换为...

    Oracle行转列之pivot

    在Oracle数据库中,行转列(也称为数据透视)和列转行(unpivot)是SQL查询中用于数据转换的高级功能。...通过实际的使用示例和语法说明,本文旨在为读者提供一个全面的Oracle行转列之PIVOT功能的指南。

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

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

    Oracle行转列

    Oracle行转列 Oracle行转列是指在Oracle数据库中将行数据转换为列数据或将列数据转换为行数据的操作。这种操作在实际应用中非常有用,例如,在数据报表、数据分析和数据挖掘等领域都需要使用行转列操作。 1. 列...

    Oracle行转列(不定列)

    总的来说,Oracle数据库提供了`PIVOT`功能来实现行转列,对于确定的列数,`PIVOT`是高效且直接的解决方案。而在面对不定列时,动态SQL和自定义函数成为更合适的选择。在实际应用中,我们需要根据具体需求和数据特性...

    oracle行转列聚合函数WMSYS.WM_CONCAT

    ### Oracle行转列聚合函数WMSYS.WM_CONCAT详解 #### 一、概述 在进行数据处理时,经常会遇到需要将多行数据合并为单行的情况,这通常被称为“行转列”。Oracle数据库提供了多种方法来实现这一需求,其中`WMSYS.WM_...

    oracle动态行转列

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

    oracle行转列,列转行的例子

    oracle行转列,列转行的例子

    ORACLE行转列

    许多情况下,由于程序中需要将行转为列展示,如果使用ORACLE那么这个资源适合你。

    oracle实现行转列功能,并使用逗号进行隔开拼接,成为一条数据.pdf

    Oracle 实现行转列功能并使用逗号进行隔开拼接成为一条数据 Oracle 中实现行转列功能,并使用逗号进行隔开拼接,成为一条数据是指将多行数据合并成一行数据,并用逗号分隔每个字段的值。这种功能在实际应用中非常...

    Sql,oracle数据表行转列问题

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

    Oracle行转列题目:面试题目.sql

    面试题目.sql

    Oracle实现行转换成列的方法

    在Oracle数据库中,这种行转列的操作可以通过多种方法实现,包括使用`PIVOT`操作、`DECODE`函数以及自定义的聚合函数等。下面我们将详细讨论这些方法,并结合提供的实例进行解析。 首先,我们来看一个简单的例子,...

Global site tag (gtag.js) - Google Analytics