美文网首页MySQL
MySQL 行转列小结

MySQL 行转列小结

作者: 只是甲 | 来源:发表于2020-05-25 09:04 被阅读0次

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

需求:求emp表各个岗位的工资之和,如无,用0代替

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

一.CASE语法

SELECT deptno,
       ifnull(sum(case when job = 'MANAGER' then sal else 0 end),0)  s_MANAGER,
       ifnull(sum(case when job = 'ANALYST' then sal else 0 end),0)  s_ANALYST,
       ifnull(sum(case when job = 'CLERK' then sal else 0 end),0)    s_CLERK,
       ifnull(sum(case when job = 'PRESIDENT' then sal else 0 end),0)  s_PRESIDENT,
       ifnull(sum(case when job = 'SALESMAN' then sal else 0 end),0)  s_SALESMAN
  FROM emp
 GROUP BY deptno;
mysql> SELECT deptno,
    ->        ifnull(sum(case when job = 'MANAGER' then sal else 0 end),0)  s_MANAGER,
    ->        ifnull(sum(case when job = 'ANALYST' then sal else 0 end),0)  s_ANALYST,
    ->        ifnull(sum(case when job = 'CLERK' then sal else 0 end),0)    s_CLERK,
    ->        ifnull(sum(case when job = 'PRESIDENT' then sal else 0 end),0)  s_PRESIDENT,
    ->        ifnull(sum(case when job = 'SALESMAN' then sal else 0 end),0)  s_SALESMAN
    ->   FROM emp
    ->  GROUP BY deptno;
+--------+-----------+-----------+---------+-------------+------------+
| deptno | s_MANAGER | s_ANALYST | s_CLERK | s_PRESIDENT | s_SALESMAN |
+--------+-----------+-----------+---------+-------------+------------+
|     10 |   2450.00 |      0.00 | 1300.00 |     5000.00 |       0.00 |
|     20 |   2975.00 |   6000.00 | 1900.00 |        0.00 |       0.00 |
|     30 |   2850.00 |      0.00 |  950.00 |        0.00 |    5600.00 |
+--------+-----------+-----------+---------+-------------+------------+
3 rows in set (0.00 sec)

需求:部门编号为20的所有的员工信息,以行的形式显示

二.group_concat语法

group_concat语法:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])

-- 默认分隔符是','
SELECT T.DEPTNO, group_concat(t.ename) names
  FROM EMP T
 WHERE T.DEPTNO = '20'
 GROUP BY T.DEPTNO;

-- 指定根据ename字段排序,分隔符为'-'
SELECT T.DEPTNO, group_concat(t.ename order by ename SEPARATOR '-') names
  FROM EMP T
 WHERE T.DEPTNO = '20'
 GROUP BY T.DEPTNO;

mysql> -- 默认分隔符是','
mysql> SELECT T.DEPTNO, group_concat(t.ename) names
    ->   FROM EMP T
    ->  WHERE T.DEPTNO = '20'
    ->  GROUP BY T.DEPTNO;
+--------+------------------------------+
| DEPTNO | names                        |
+--------+------------------------------+
|     20 | SMITH,JONES,SCOTT,ADAMS,FORD |
+--------+------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 指定根据ename字段排序,分隔符为'-'
mysql> SELECT T.DEPTNO, group_concat(t.ename order by ename SEPARATOR '-') names
    ->   FROM EMP T
    ->  WHERE T.DEPTNO = '20'
    ->  GROUP BY T.DEPTNO;
+--------+------------------------------+
| DEPTNO | names                        |
+--------+------------------------------+
|     20 | ADAMS-FORD-JONES-SCOTT-SMITH |
+--------+------------------------------+
1 row in set (0.00 sec)

相关文章

  • MySQL 行转列小结

    备注:测试数据库版本为MySQL 8.0 需求:求emp表各个岗位的工资之和,如无,用0代替 如需要scott用户...

  • Mysql行转列

    遇到的一个Sql面试题: 建表: Sql: 结果:

  • mysql 行转列

    参考文章https://www.cnblogs.com/xiaoxi/p/7151433.html

  • mysql行转列

    使用GROUP BY 和 GROUP_CONCAT即可

  • mysql 行转列

    GROUP_CONCAT(m.step,if(um.is_complete=1,'已完成','未完成') ORDE...

  • MySQL 行转列,列传行

    静态行转列 使用case...when....then 进行行转列 使用IF() 进行行转列 (1)SUM() 是...

  • SQL Server行转列

    SQL行转列 经典实例 创建表格 SQL行转列 经典实例 创建表格 行转列 结果 参考链接

  • mysql 行转列操作

    1 摘要 mysql 行列转换 ,在项目中应用的极其频繁,尤其是一些金融项目里的报表。其中最为头痛的就是多行转多列...

  • mysql行转列转换

    sql 脚本 静态行专列 运行结果

  • Oracle 行转列

    行转列,以, 分隔 将行转列语句提取成一个Function

网友评论

    本文标题:MySQL 行转列小结

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