打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
多行转一行的排序问题

本文 在下文的 基础上, 做的修改

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
--------------------------------------------------------------
李四
系统分析员,项目经理

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
WMSYS.WM_CONCAT 列变行_Seventh Space
oracle 10g 行列转换
oracle行列转换函数的使用
wmsys.wm
oracle行转列组合成字符串函数
ORACLE 12C创建wm_concat函数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服