美文网首页
MySQL 把结果集转置为多行

MySQL 把结果集转置为多行

作者: 只是甲 | 来源:发表于2020-11-27 14:39 被阅读0次

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

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

一.需求

要把行转换为列,根据原表给定列的每个值创建一个列。

例如,返回每个员工及他们的职位(JOB),目前的查询返回如下结果集:

希望重新设置为结果集的格式,使每个职位使用一列:

二.解决方案

要解决本例的问题,必须使每个job/ename组合唯一,然后,在使用聚集函数去除null时,不会丢失ename。

使用标量子查询,按empno给每个员工分等级。
使用CASE表达式和聚集函数MAX对结果集进行转置变换,同事按子查询的返回值分组:

select max(case when job = 'CLERK'
                then ename else null end) as clerks,
       max(case when job = 'ANALYST'
                then ename else null end) as analysts,
       max(case when job = 'MANAGER'
                then ename else null end) as mgrs,
       max(case when job = 'PRESIDENT'
                then ename else null end) as prez,
       max(case when job = 'SALESMAN'
                then ename else null end) as sales
  FROM (
 SELECT  e.job,
         e.ename,
         (select count(*) from emp d
           where e.job = d.job and e.empno < d.empno) as rnk
   from emp e
        ) x
group by rnk
order by rnk
;

测试记录:

mysql> select max(case when job = 'CLERK'
    ->                 then ename else null end) as clerks,
    ->        max(case when job = 'ANALYST'
    ->                 then ename else null end) as analysts,
    ->        max(case when job = 'MANAGER'
    ->                 then ename else null end) as mgrs,
    ->        max(case when job = 'PRESIDENT'
    ->                 then ename else null end) as prez,
    ->        max(case when job = 'SALESMAN'
    ->                 then ename else null end) as sales
    ->   FROM (
    ->  SELECT  e.job,
    ->          e.ename,
    ->          (select count(*) from emp d
    ->            where e.job = d.job and e.empno < d.empno) as rnk
    ->    from emp e
    ->         ) x
    -> group by rnk
    -> order by rnk
    -> ;
+--------+----------+-------+------+--------+
| clerks | analysts | mgrs  | prez | sales  |
+--------+----------+-------+------+--------+
| MILLER | FORD     | CLARK | KING | TURNER |
| JAMES  | SCOTT    | BLAKE | NULL | MARTIN |
| ADAMS  | NULL     | JONES | NULL | WARD   |
| SMITH  | NULL     | NULL  | NULL | ALLEN  |
+--------+----------+-------+------+--------+
4 rows in set (0.00 sec)

相关文章

  • MySQL 把结果集转置为多行

    备注:测试数据库版本为MySQL 8.0 如需要scott用户下建表及录入数据语句,可参考:scott建表及录入数...

  • MySQL 给两次转置的结果集增加列头

    备注:测试数据库版本为MySQL 8.0 测试数据: 一.需求 把两个结果集叠在一起,然后把他们转置为两列,另外,...

  • MySQL 反向转置结果集

    备注:测试数据库版本为MySQL 8.0 如需要scott用户下建表及录入数据语句,可参考:scott建表及录入数...

  • MySQL 将结果集转置为一行

    备注:测试数据库版本为MySQL 8.0 如需要scott用户下建表及录入数据语句,可参考:scott建表及录入数...

  • MySQL 转置带小计的结果集

    备注:测试数据库版本为MySQL 8.0 如需要scott用户下建表及录入数据语句,可参考:scott建表及录入数...

  • MySQL 转置已分等级的结果集

    备注:测试数据库版本为MySQL 8.0 如需要scott用户下建表及录入数据语句,可参考:scott建表及录入数...

  • MySQL 转置结果集以利于跨行计算

    备注:测试数据库版本为MySQL 8.0 如需要scott用户下建表及录入数据语句,可参考:scott建表及录入数...

  • 1.3 Numpy通用函数

    数组形状 1----.T 用法 # .T方法:转置,例如原shape为(3,4)/(2,3,4),转置结果为(4,...

  • MySQL 行列转置

    建立测试表: 原始数据: 需要转置为: 即:将 事件名(event_name)作为纵向表头,日期(dt)作为横向表...

  • 线性代数(5) 行列式的性质

    行列式转置 所谓转置就是把原来的行做成列就是转置的操作。转置符号就是用上标 T,矩阵的转置也是这样表示。有关转置在...

网友评论

      本文标题:MySQL 把结果集转置为多行

      本文链接:https://www.haomeiwen.com/subject/cdxlmktx.html