본문 바로가기
DB/oracle

decode 사용 해서 그룹 만들기 start with union all 조인에 해서 안보이는 자료 보이기

by 새로운 도전을 위한 한걸음 2015. 5. 10.

SELECT ename, a.deptno, b.deptno, dname, loc
FROM EMP a, DEPT b
WHERE A.DEPTNO (+)= B.DEPTNO;
  ^
  |
  outer join : 조인이 안된 모든 자료를 표시 ..


자료가 없는 데이터 까지 조인해서 검색한것을 표시 .

SELECT deptno, COUNT(empno) FROM (
SELECT  dept.deptno, empno, ename FROM EMP, DEPT
  WHERE emp.deptno(+) = dept.deptno)
        GROUP BY deptno

/*12/10일 문제

특정 부서 번호에 평균 , 최대 값, 최소값(union all 사용)
결과 값
================================
    | 평균 | 최대 | 최소(sal)
================================
10  |        |       |
================================
표시  한로우에 표시 해야 함
결과 값 ..
/* sql*/
SELECT AVG(sal) a, 0 b, 0 c FROM EMP WHERE deptno = 10
UNION all
SELECT 0 a, MAX(sal) b, 0 c FROM EMP WHERE deptno = 10
UNION all
SELECT 0 a, 0 b,min(sal) c FROM EMP WHERE deptno = 10 ;
/*결과값*/
2916.66666666667 0 0
0   5000 0
0   0 1300

 

 


*/


SELECT LEVEL,ename, empno,mgr FROM emp
START WITH ename = 'KING'
CONNECT BY PRIOR  empno=mgr

start 찾고자 하는 데이타 ex) ename = 'KING'
connect by  prior 상위에 데이타 empno = mgr
결과값    상위 하위
level ename empno   mgr
============================
1 KING 7839 null
2 JONES 7566 7839
3 SCOTT 7788 7566
4 ADAMS 7876 7788

SELECT LPAD(' ',3*LEVEL)||ename, empno,mgr FROM emp
START WITH ename = 'KING'
CONNECT BY PRIOR  empno=mgr

lpad를 해서 앞에 공백 문자를 만든다.
결과값
====================================
 ename  empno mgr
     KING  7839 
      JONES  7566 7839
         SCOTT  7788 7566
            ADAMS 7876 7788
         FORD  7902 7566
            SMITH 7369 7902

/* DECODE를 이용하여 그룹 지어서 SQL
SELECT DECODE(RN,1,DEPTNO), MAX(DEPTNO), SUM(SAL) FROM
EMP,( SELECT 1 rn FROM dual UNION ALL
SELECT 2 FROM dual) GROUP BY DECODE(RN,1,DEPTNO))
*/

결과문 ... 
30 30 9400
 30 29025
20 20 10875
10 10 8750