有关oracle数据库中多行转换成一行的问题
第一步
首先创建一个表格
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 CREATE TABLE TestTitle ( 2 3 name VARCHAR(10), 4 5 titleVARCHAR(10) 6 7 );
第二步
插入测试数据
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
第二步,根据有编号的子查询,进行分组处理
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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;