1 同样是一个公司的人,待遇差距咋就那么大呢?
公司年度总结出来了。部门10盈利增长100%。部门20也增长了。负增长50%。
经过公司党委,工会,董事会啥的研究决定:
给部门10的员工每人涨工资1000元的工资。
给部门20的员工每人涨负200刀元工资。
?
现在要求先出个报表看一下调整之后的工资情况。
?
情况就是这么个情况。事情就是这么个事情。
我们先来看一下数据。
EMPNO ENAME SAL DEPTNO
7369 SMITH 800.00 20
7499 ALLEN 1600.00 30
7521 WARD 1250.00 30
7566 JONES 2975.00 20
7654 MARTIN 1250.00 30
7698 BLAKE 2850.00 30
7782 CLARK 2450.00 10
7788 SCOTT 3000.00 20
7839 KING 5000.00 10
7844 TURNER 1500.00 30
7876 ADAMS 1100.00 20
7900 JAMES 950.00 30
7902 FORD 3000.00 20
7934 MILLER 1300.00 10
最基本的思路
1 找出部门10的员工姓名 工资 部门编号 然后将其工资+1000
2 找出部门20的员工姓名 工资部门编号 然后将其工资-500
3 两个结果集相连 一切就OK了。
1 找出部门10的员工姓名 工资 部门编号 然后将其工资+1000
SELECT EMPNO, ENAME, SAL + 1000, DEPTNO FROM EMP WHERE DEPTNO = 10
EMPNO ENAME SAL+1000 DEPTNO
7782 CLARK 3450 10
7839 KING 6000 10
7934 MILLER 2300 10
2 找出部门20的员工姓名 工资部门编号 然后将其工资-500
SELECT EMPNO, ENAME, SAL -500, DEPTNO FROM EMP WHERE DEPTNO = 20
EMPNO ENAME SAL-500 DEPTNO
7369 SMITH 300 20
7566 JONES 2475 20
7788 SCOTT 2500 20
7876 ADAMS 600 20
7902 FORD 2500 20
连接起来 为了便于观察我们按照部门编号排序
SELECT EMPNO, ENAME, SAL - 500, DEPTNO
FROM EMP
WHERE DEPTNO = 20
Union All
SELECT EMPNO, ENAME, SAL + 1000, DEPTNO
FROM EMP
WHERE DEPTNO = 10
Order By deptno
EMPNO ENAME SAL-500 DEPTNO
7839 KING 6000 10
7782 CLARK 3450 10
7934 MILLER 2300 10
7902 FORD 2500 20
7788 SCOTT 2500 20
7566 JONES 2475 20
7369 SMITH 300 20
7876 ADAMS 600 20
很好很和谐。结果正确。
但是请注意 我们访问了两次EMP表。
如果用CASE呢?这个查询完全可以合并到一个查询当中去。
使用CASE 完成查询所需要考虑的事情
1 是否访问相同的表。如果访问的表不同就不用考虑了2 是否使用相同的列。 如果是基本肯定可以合并了 如果不同的条件有组合 就需要注意业务逻辑。3 如果使用的列不同。那么不同UNION 查询的条件是否有交集。 如果没有 基本上也可以合并。不过需要注意合并后的性能问题。根据上面的注意事项我们来审视一下上面的例子
1 是否访问相同的表?
是
2 是否使用相同的列
也是,且没有交集。
那么开始我们的合并。
1 先找到10 20部门的员工
SELECT EMPNO, ENAME, SAL , DEPTNO FROM EMP WHERE DEPTNO In (10,20)
EMPNO ENAME SAL DEPTNO
7369 SMITH 800.00 20
7566 JONES 2975.00 20
7782 CLARK 2450.00 10
7788 SCOTT 3000.00 20
7839 KING 5000.00 10
7876 ADAMS 1100.00 20
7902 FORD 3000.00 20
7934 MILLER 1300.00 10
然后根据部门的不同调整工资。
SELECT EMPNO,
ENAME,
SAL + (CASE
WHEN DEPTNO = 10 THEN
1000
WHEN DEPTNO = 20 THEN
-500
END) SAL,
DEPTNO
FROM EMP
WHERE DEPTNO IN (10, 20)
EMPNO ENAME SAL DEPTNO
7934 MILLER 2300 10
7782 CLARK 3450 10
7839 KING 6000 10
7902 FORD 2500 20
7876 ADAMS 600 20
7566 JONES 2475 20
7369 SMITH 300 20
7788 SCOTT 2500 20
也达到相同的目的。但是这次我们使用了CASE 只访问了一次表
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24558043/viewspace-675550/
,如需转载,请注明出处,否则将追究法律责任。