一步到位: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:
```sqlSELECT 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,将收集的数据保存到临时表中:
```sqlINSERT INTO temp_Listagg_table
(listagg_table_id, dept_no, name)SELECT
rownum, dept_no,
nameFROM
employee;
最后,从这个表中可以更方便地提取结果集:
“`sql
SELECT dept_no,
LISTAGG (name, ‘;’)
WITHIN GROUP (ORDER BY name) AS names
FROM temp_listagg_table
GROUP BY dept_no;
以上两种情况都可以将多行数据合并成单行,实现一步到位的目的,方便的查询出结果。