标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。