本文 在下文的 基础上, 做的修改
SQL查询案例:多行转换为一行
CREATE TABLE TestTitle ( name VARCHAR(10), seq INT, title VARCHAR(10) );
INSERT INTO TestTitle VALUES ('张三', 3, '程序员'); INSERT INTO TestTitle VALUES ('张三', 1, '系统管理员'); INSERT INTO TestTitle VALUES ('张三', 2, '网络管理员');
INSERT INTO TestTitle VALUES ('李四', 2, '项目经理'); INSERT INTO TestTitle VALUES ('李四', 1, '系统分析员');
这里要求 是, 合并后, 字符的顺序,是按照 seq 来排序的
也就是最后的结果,希望是
李四 系统分析员,项目经理
张三 系统管理员,网络管理员,程序员
对于MySQL使用 GROUP_CONCAT 函数 的方式进行处理
首先是 不排序的情况下,默认的查询结果:
mysql> SELECT -> name, -> GROUP_CONCAT(title) AS allTitle -> FROM -> TestTitle -> GROUP BY -> name; +------+------------------------------+ | name | allTitle | +------+------------------------------+ | 李四 | 项目经理,系统分析员 | | 张三 | 程序员,系统管理员,网络管理员 | +------+------------------------------+ 2 rows in set (0.00 sec)
然后是按照 seq 的顺序进行排列的查询结果:
mysql> SELECT -> name, -> GROUP_CONCAT(title) AS allTitle -> FROM -> ( -> SELECT -> name, -> title -> FROM -> TestTitle -> ORDER BY -> seq -> ) as subQuery -> GROUP BY -> name; +------+------------------------------+ | name | allTitle | +------+------------------------------+ | 李四 | 系统分析员,项目经理 | | 张三 | 系统管理员,网络管理员,程序员 | +------+------------------------------+ 2 rows in set (0.00 sec)
对于Oracle使用 WMSYS.WM_CONCAT 函数 的方式进行处理
首先是 不排序的情况下,默认的查询结果:
SQL> SQL> SELECT 2 name, 3 WMSYS.WM_CONCAT(title) AS allTitle 4 FROM 5 TestTitle 6 GROUP BY 7 name;
NAME ---------- ALLTITLE ------------------------------------------- 李四 项目经理,系统分析员
张三 程序员,系统管理员,网络管理员
然后是按照 seq 的顺序进行排列的查询结果:
SQL> with myCTE AS 2 ( 3 SELECT 4 name, 5 seq, 6 WMSYS.WM_CONCAT(title) 7 OVER(PARTITION BY name ORDER BY seq) AS allTitle 8 FROM 9 TestTitle 10 ) 11 SELECT 12 name, allTitle 13 FROM 14 myCTE 15 WHERE 16 NOT EXISTS( 17 SELECT 1 18 FROM myCTE sub 19 WHERE myCTE.name = sub.name 20 AND myCTE.seq < sub.seq 21 );
NAME ---------- ALLTITLE -------------------------------------------------------------- 李四 系统分析员,项目经理
张三 系统管理员,网络管理员,程序员
|