有关oracle数据库中多行转换成一行的问题

第一步

首先创建一个表格

View Code
1 CREATE TABLE TestTitle (
2 
3 name   VARCHAR(10),
4 
5 titleVARCHAR(10)
6 
7 );

第二步
插入测试数据

View Code
1 INSERT INTO TestTitle VALUES ('张三', '程序员');
2 INSERT INTO TestTitle VALUES ('张三', '系统管理员');
3 INSERT INTO TestTitle VALUES ('张三', '网络管理员');
4 INSERT INTO TestTitle VALUES ('李四', '项目经理');
5 INSERT INTO TestTitle VALUES ('李四', '系统分析员');

要求
对于测试数据,要求查询结果为:

张三程序员,系统管理员,网络管理员

李四项目经理,系统分析员

思路
简单查看这个结果,很像对字符型的GROUP BY处理。

数值类型的可以SUM,但是字符类型的无法这么处理。

只好依次MAX(1) + MAX(2) + MAX(3)这种办法来处理

实现
第一步,设置好分组的编号

View Code
 1 SELECT
 2 
 3 ROW_NUMBER() OVER(PARTITION BY name ORDER BY title) AS no,
 4 
 5 name,
 6 
 7 title
 8 
 9 FROM
10 
11 TestTitle
12 
13 ORDER BY
14 
15 name,
16 
17 title

 第二步,根据有编号的子查询,进行分组处理

View Code
 1 SELECT
 2 
 3 name,
 4 
 5 CASE WHEN COUNT(title) = 1 THEN MAX(title)
 6 
 7        WHEN COUNT(title) = 2 THEN
 8 
 9          MAX( CASE WHEN SubQuery.no = 1 THEN title + '' ELSE '' END )
10 
11          + MAX( CASE WHEN SubQuery.no = 2 THEN titleELSE '' END )
12 
13        WHEN COUNT(title) = 3 THEN
14 
15          MAX( CASE WHEN SubQuery.no = 1 THEN title + '' ELSE '' END )
16 
17          + MAX( CASE WHEN SubQuery.no = 2 THEN title + ''ELSE '' END )
18 
19          + MAX( CASE WHEN SubQuery.no = 3 THEN titleELSE '' END )
20 
21 END AS new_title
22 
23 FROM
24 
25 (
26 
27 SELECT
28 
29     ROW_NUMBER() OVER(PARTITION BY name ORDER BY title) AS no,
30 
31     name,
32 
33     title
34 
35 FROM
36 
37     TestTitle
38 
39 ) subQuery
40 
41 GROUP BY
42 
43 name

对于Oracle使用 WMSYS.WM_CONCAT 函数 的方式进行处理(也非常简单)

 SELECT name,WMSYS.WM_CONCAT(title) AS allTitle FROM TestTitle GROUP BY name;

原文地址:https://www.cnblogs.com/wsl2011/p/2485425.html