`
mikixiyou
  • 浏览: 1100736 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353701
社区版块
存档分类
最新评论

SQL实现多行记录聚合成一行

阅读更多

将一个字段的多行记录按照另一个字段值进行分组,组合成一行记录。新组合成的一行记录可以使用特定字符如逗号加以区分。

在以前的文档中,我写好一个方法( http://mikixiyou.iteye.com/blog/1489127 )。使用row_number() over 函数。那是在Oracle 10g中使用到的,在11g中提供一个新函数listagg来实现该功能,简单易用。

 


在Oracle 10g中,如果将scott.emp中字段deptno相同的不同ename的记录,从多行记录聚合转换成一行。这是需要自己开发才能完成的。
scott.emp表中原始记录如下:
   DEPTNO ENAME
--------- ----------
       10 CLARK
       10 KING
       10 MILLER
       20 ADAMS
       20 FORD
       20 JONES
      
聚合后的结果如下:

   DEPTNO AGGREGATED_ENAMES
--------- -------------------------
       10 CLARK,KING,MILLER
       20 ADAMS,FORD,JONES

自己开发实现的程序如下:      

 

select deptno, substr(max(sys_connect_by_path(ename, ',')), 2) as employees
  from (select deptno,
               ename,
               row_number() over(partition by deptno order by ename) as rown
          from emp)
 start with rown = 1
connect by prior deptno = deptno
       and prior rown = rown - 1
 group by deptno;
 

 

(miki西游  @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1627981 )


在11g中,提供了一个新函数 listagg,可以实现这种功能。

listagg的语法如下:

LISTAGG( [,]) WITHIN GROUP (ORDER BY ) [OVER (PARTITION BY )]

WITHIN GROUP 是关键字,必须加。
ORDER BY 也是关键字,必须加。
OVER (PARTITION BY)是可选子句,加上能将聚合函数变成分析函数。

实现该功能的程序如下:

SELECT deptno,
       LISTAGG(ename, ',') WITHIN GROUP(ORDER BY ename) AS employees
  FROM emp
 GROUP BY deptno;
 

 
使用over子句将该函数变成分析函数。

SELECT deptno,
       ename,
       hiredate,
       LISTAGG(ename, ',') WITHIN GROUP(ORDER BY hiredate) OVER(PARTITION BY deptno) AS employees
  FROM emp;
 

将每个员工的信息都列出来,最后一项是该员工所在部门所有员工的员工排列,并且是按照雇佣时间排列的。

得到的结果如下:

     DEPTNO ENAME      HIREDATE    EMPLOYEES
--------- ---------- ----------- -------------------------------------
        10 CLARK      09/06/1981  CLARK,KING,MILLER
        10 KING       17/11/1981  CLARK,KING,MILLER
        10 MILLER     23/01/1982  CLARK,KING,MILLER
        20 SMITH      17/12/1980  SMITH,JONES,FORD,SCOTT,ADAMS
        20 JONES      02/04/1981  SMITH,JONES,FORD,SCOTT,ADAMS
        20 FORD       03/12/1981  SMITH,JONES,FORD,SCOTT,ADAMS
        20 SCOTT      19/04/1987  SMITH,JONES,FORD,SCOTT,ADAMS
        20 ADAMS      23/05/1987  SMITH,JONES,FORD,SCOTT,ADAMS
        30 ALLEN      20/02/1981  ALLEN,WARD,BLAKE,TURNER,MARTIN,JAMES
        30 WARD       22/02/1981  ALLEN,WARD,BLAKE,TURNER,MARTIN,JAMES
        30 BLAKE      01/05/1981  ALLEN,WARD,BLAKE,TURNER,MARTIN,JAMES
        30 TURNER     08/09/1981  ALLEN,WARD,BLAKE,TURNER,MARTIN,JAMES
        30 MARTIN     28/09/1981  ALLEN,WARD,BLAKE,TURNER,MARTIN,JAMES
        30 JAMES      03/12/1981  ALLEN,WARD,BLAKE,TURNER,MARTIN,JAMES

 

 

 

分享到:
评论

相关推荐

    sql实现多行合并一行

    在SQL中,有时候我们需要将查询结果中多行的数据合并成一行,这在处理某些特定的报表或数据分析时非常有用。这种技术通常被称为行合并或行聚合。在本例中,我们将探讨如何使用纯SQL实现这一功能,特别是针对Oracle...

    Oracle多行记录合并

    在Oracle数据库中,多行记录的合并通常是为了将相同字段的多行数据整合成一行,以便于数据分析或者简化展示。这种操作在报表制作、数据整理等场景中非常常见。本篇文章将详细介绍Oracle中实现多行记录合并的几种方法...

    SQL语句行数据拆成多行及多行数据合并成一行的方法.docx

    ### SQL语句行数据拆成多行及多行数据合并成一行的方法 #### 一、SQL语句对一行(单元格)数据拆分成多行 在处理数据时,有时我们需要将一行数据拆分成多行,这在数据分析和报表制作中非常常见。下面将详细介绍几...

    sql 多行合并某一列字符串拼接的示例

    在SQL中,将多行数据合并为一行,尤其是在某一列进行字符串拼接,是一项常见的需求。这通常用于汇总数据、创建报表或者为了分析目的而整合信息。本文将深入探讨如何利用SQL实现多行数据的合并,特别关注字符串拼接的...

    Oracle字段转字符串/多行记录合并/连接/聚合字符串的几种方法

    在Oracle数据库中,有时我们需要将多个字段值转换为单个字符串,或者将多行记录合并成一行,这在数据处理和报告生成时尤其常见。Oracle提供了多种方法来实现这一目标,包括使用内置函数、PL/SQL过程以及一些高级特性...

    mysql如何将多行数据合并成一行

    在MySQL数据库中,有时我们需要将查询结果中的多行数据合并为一行,以便更方便地查看或分析。这种操作通常在处理具有多个相关列且需要汇总数据时非常有用。`GROUP_CONCAT` 函数是MySQL提供的一种功能,可以实现这一...

    SQLServer行列互转实现思路(聚合函数)

    本篇文章将深入探讨如何使用聚合函数Pivot和Unpivot来实现这一目标,特别是针对SQL Server数据库。 首先,让我们了解什么是行转列。行转列就是将表格中的某列值变为新的列名,而原本的行数据则对应到这些新列中。举...

    SQL Sever中使用SQL语句实现把重复行数据合并为一行并用逗号分隔

    在SQL Server中,有时我们需要将具有相同值的重复行数据合并为一行,并使用逗号作为分隔符。这种操作在数据分析、报告生成或简化显示时非常有用。本文将详细介绍两种方法来实现这一目标,这两种方法都基于SQL Server...

    mysql如何实现多行查询结果合并成一行

    在MySQL数据库中,有时我们需要将具有相同标识符的多行数据合并成一行,尤其是在处理具有关联列表或集合的数据时。在这种情况下,`GROUP_CONCAT()` 函数是一个非常实用的工具。这个函数允许我们将多行结果合并成单行...

    Sql function 多行中的列合并为一行一列的方法

    在SQL中,有时候我们需要将多行数据合并成一行,特别是在处理具有多个相关值的列时。这个场景在处理报告、汇总或分析时尤其常见。在给出的示例中,我们看到一个名为`tb`的表格,它有五列:`standards`、`amount`、`...

    Oracle 多行记录合并/连接/聚合字符串的几种方法

    这个问题涉及到字符串的连接和聚合,使得多个记录的某个字段值能够整合到一行。在Oracle中,虽然没有内置的聚合函数直接支持这种操作,但可以通过一些技巧和自定义方法来实现。下面我们将对几种常用的方法进行详细...

    SQL 关于记录排序 sqlserver

    如果两行或多行具有相同的值,则它们将获得相同的排名,并且下一行的排名将跳过相应的数字。例如,如果有两行并列第一,则下一行将被标记为第三名。 #### 基本语法 ```sql SELECT column1, column2, RANK() OVER ...

    SQL中如何实现行转列.rar

    在传统的表格数据中,每一行代表一个记录,每一列代表一个属性。但在某些场景下,如比较不同时间段的数据或展示多维度信息,将行数据转换为列可以使得数据更直观、易读。 SQL中实现行转列的方法主要有以下几种: 1...

    sql里将重复行数据合并为一行数据使用逗号进行分隔

    在SQL中,有时我们需要将具有相同属性的重复行数据合并成一行,并使用特定的分隔符,如逗号,来区分各个值。这种操作在处理报告或者数据分析时非常常见,可以减少数据的冗余,使结果更加简洁。本文将详细讲解如何在...

    mysql利用group_concat()合并多行数据到一行

    在MySQL数据库中,`GROUP_CONCAT()` 函数是一个非常实用的聚合函数,它允许我们将多行数据合并成一行,特别适合处理一对多关系的数据。在上述的标题和描述中,我们看到一个具体的应用场景,即如何在SQL层面上将一对...

    SQL数据库语言学习记录

    SQL数据库遵循关系模型,其中数据被组织成表格形式,每个表格由多个列和行组成。 2. SQL语句类型:SQL主要包含四种基本语句类型:SELECT(查询)、INSERT(插入)、UPDATE(更新)和DELETE(删除)。SELECT语句用于...

Global site tag (gtag.js) - Google Analytics