ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

《SQL经典实例》:8. 变换展示方式,层次关系

2022-01-14 18:33:18  阅读:139  来源: 互联网

标签:CASE END 变换 WHEN ELSE job 实例 SQL SELECT


目录

变换结果集为一行&多列

层次关系


变换结果集为一行&多列

  • 想由左图变为右图这种展示方式:

                           

SELECT 
sum(CASE WHEN deptno = 10 THEN 1 ELSE 0 END) AS deptno_10,
sum(CASE WHEN deptno = 20 THEN 1 ELSE 0 END) AS deptno_20,
sum(CASE WHEN deptno = 30 THEN 1 ELSE 0 END) AS deptno_30
FROM emp;
  • 想汇总成如下展示方式:

SELECT 
min(CASE WHEN job = 'clerk' THEN ename ELSE null END) AS 'clerks',
min(CASE WHEN job = 'analyst' THEN ename ELSE null END) AS 'analyst',
min(CASE WHEN job = 'manager' THEN ename ELSE null END) AS 'manager',
min(CASE WHEN job = 'president' THEN ename ELSE null END) AS 'president',
min(CASE WHEN job = 'salesman' THEN ename ELSE null END) AS 'salesman'
FROM
(SELECT e.job, e.ename, 
(SELECT count(*) FROM emp d WHERE d.job = e.job AND d.empno > e.empno) AS rnk
FROM emp e ORDER BY rnk)x
GROUP BY rnk;

这种变换的关键在于,给每个人赋予同一个job内部排名,这样才不会出现这种情况:

 

层次关系

确认叶子节点、分支节点和根节点,针对每一种节点类型分别计算出正确的“布尔”值。

想得到如下结果:

SELECT e.ename,
(SELECT SIGN(count(*)) FROM emp d WHERE (SELECT count(*) FROM emp f WHERE f.mgr = e.empno) = 0) AS is_leaf,
(SELECT SIGN(count(*)) FROM emp d WHERE d.mgr = e.empno AND e.mgr is not null) AS is_branch, 
(SELECT SIGN(count(*)) FROM emp d WHERE d.empno = e.empno AND d.mgr is null) AS is_root
FROM emp e
ORDER BY 4 desc, 3 desc, 2 desc;

利用SIGN函数,返回布尔值:当sign内是整数,返回1;是0,返回0,是负数,返回-1 

 

标签:CASE,END,变换,WHEN,ELSE,job,实例,SQL,SELECT
来源: https://blog.csdn.net/Nancyninghao/article/details/122499447

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有