暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 将结果集方向转为一列

原创 只是甲 2021-01-27
686

备注:测试数据库版本为MySQL 8.0

如需要scott用户下建表及录入数据语句,可参考:
scott建表及录入数据sql脚本

一.需求

把查询中返回的所有列转换为1列。
例如,返回deptno 10中所有员工的ename、job和sal,而且要把这3个值放到一列中。
为每个员工返回3行信息,而且在两个员工之间加一个空白行。

希望返回的结果集如下:
±----------+
| emps |
±----------+
| CLARK |
| MANAGER |
| 2450 |
| NULL |
| KING |
| PRESIDENT |
| 5000 |
| NULL |
| MILLER |
| CLERK |
| 1300 |
| NULL |
±----------+

二.解决方案

关键是用笛卡尔积为每个员工返回4行。这样就可以为每列产生一行,而且在两个员工之间加一个空白行。

select case rn when 1 then ename when 2 then job when 3 then cast(sal as char(4)) end emps from ( select e.ename, e.job,e.sal, row_number() over w as 'rn' from emp e, ( select * from emp where job = 'CLERK') four_rows where e.deptno = 10 window w as (partition by e.empno order by e.empno ) ) x;

测试记录:

mysql> select case rn
    ->             when 1 then ename
    ->             when 2 then job
    ->             when 3 then cast(sal as char(4))
    ->        end emps
    ->   from (
    ->  select  e.ename, e.job,e.sal,
    ->          row_number() over w as 'rn'
    ->    from  emp e,
    ->          ( select *
    ->              from emp where job = 'CLERK') four_rows
    ->
    ->   where e.deptno = 10
    ->   window w as (partition by e.empno order by e.empno )
    ->     ) x;
+-----------+
| emps      |
+-----------+
| CLARK     |
| MANAGER   |
| 2450      |
| NULL      |
| KING      |
| PRESIDENT |
| 5000      |
| NULL      |
| MILLER    |
| CLERK     |
| 1300      |
| NULL      |
+-----------+
12 rows in set, 3 warnings (0.00 sec)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论