一步到位:Oracle将多行合并为单行(oracle多行合并成一行)

当由N多行构成的数据集需要被视为仅有一行时,Oracle中的集合函数可以派上用场,可以将多行转换成单行结果,让我们一步到位地查询结果,下面就用一个例子来说明如何将多行合并为单行。

首先,说明本文使用的表格,结构及数据:

假设有一个表EMPLOYEE,表中有三列数据,列名为:id,name,dept_no。ID列用来标识每一行数据,name列以单个名字作为一行,dept_no列表示部门ID。

表中的数据如下图所示:

![图片.png](01160351_v23fuezjewy.png)

要求:将多行数据合并为单行,如下所示:

![图片.png](01160351_guwgtqsf0ky.png)

答案:可以使用Oracle内置函数LISTAGG,使用LISTAGG函数,可以将具有相同dept_no值的多行,转换成如上所示的结果,其SQL语句为:

“`sql

SELECT id,

LISTAGG(name, ‘;’ )

WITHIN GROUP (ORDER BY name) AS Names

FROM employee

GROUP BY dept_no, id;

或者可以使用多用途XML函数XMLELEMENT:
```sql
SELECT dept_no,
xmlelement("Name",xmlagg( name ORDER BY name))
FROM employee
GROUP BY dept_no;

参数WITHIN GROUP(ORDER BY …)和xmlagg(ORDER BY …)都可以用来控制输出结果中元素的顺序,以满足你的需求。

如果涉及LISTAGG函数界定字符长度内不能包括多行数据,这时候可以用一个临时表,就地展开收集多行后,保存在临时表中,最后再从这个临时表中提取数据:

“`sql

CREATE TABLE temp_Listagg_table

(listagg_table_id INT,

dept_no VARCHAR2(50),

name VARCHAR2(50));

然后,执行以下SQL,将收集的数据保存到临时表中: 
```sql
INSERT INTO temp_Listagg_table
(listagg_table_id, dept_no, name)
SELECT
rownum,
dept_no,
name
FROM
employee;

最后,从这个表中可以更方便地提取结果集:

“`sql

SELECT dept_no,

LISTAGG (name, ‘;’)

WITHIN GROUP (ORDER BY name) AS names

FROM temp_listagg_table

GROUP BY dept_no;

以上两种情况都可以将多行数据合并成单行,实现一步到位的目的,方便的查询出结果。

数据运维技术 » 一步到位:Oracle将多行合并为单行(oracle多行合并成一行)