分享

多行转一行的排序问题

 宇宙之窗 2014-06-17

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

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

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多