Temp를 이용한 문제를 풀어보자
Temp에 있는 직원들을 부서별 직급별로 SALARY 합을 보려한다 이때 부서별로 직급들이 동일행에 나오도록
보여주고 부서별 전체급여 그리고 PER컬럼의 전체 부서 급여합계 비율을 구하여라
SELECT CASE WHEN DEPTNO IS NOT NULL THEN DEPTNO ELSE '합계' END DEPTNO
, SUM(A.부장) 부장, SUM(A.차장) 차장, SUM(A.과장) 과장
, SUM(A.대리) 대리, SUM(A.사원) 사원, SUM(A.수습) 수습, SUM(A.PER) 전체급여비율
, SUM(A.SAL) 부서별급여합계
FROM (SELECT DEPT_CODE DEPTNO, SALARY SAL
, SUM(CASE WHEN LEV = '부장' THEN SALARY ELSE 0 END) 부장
, SUM(CASE WHEN LEV = '차장' THEN SALARY ELSE 0 END) 차장
, SUM(CASE WHEN LEV = '과장' THEN SALARY ELSE 0 END) 과장
, SUM(CASE WHEN LEV = '대리' THEN SALARY ELSE 0 END) 대리
, SUM(CASE WHEN LEV = '사원' THEN SALARY ELSE 0 END) 사원
, SUM(CASE WHEN LEV = '수습' THEN SALARY ELSE 0 END) 수습
, ROUND(RATIO_TO_REPORT(SALARY) OVER (),2) * 100 AS PER
, SUM(SALARY)
FROM TEMP
GROUP BY DEPT_CODE, SALARY, LEV
) A
GROUP BY ROLLUP(DEPTNO)
ORDER BY DEPTNO
--> 컬럼 합계를 하기위해서는 ROLLUP()이 필요하다
그리고 select 문에 DEPTNO별로 소계를 한다면 DEPTNO가 NULL이 되어서 CASE문에 합계라는 문자를 줄 수 있다
밑의 2개의 구문으로 컬럼의 합계를 표현할 수 있다
SELECT CASE WHEN DEPTNO IS NOT NULL THEN DEPTNO ELSE '합계' END DEPTNO
GROUP BY ROLLUP(DEPTNO)
TEST02 테이블의 자료를 이용해 최대 CRATE를 가지는 일자의 AMT와 최소 CREATE를 가지는 일자의 AMT를 읽어오는 문장을 출력하시오
SELECT distinct LAST_VALUE(AMT) OVER ( ORDER BY CRATE
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING) MAX_VAL,
FIRST_VALUE(AMT) OVER( ORDER BY CRATE
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING) MIN_VAL
FROM TEST02
'IT_Web > Oracle' 카테고리의 다른 글
Oracle - 카테시안(Cartesian) 곱을 이용한 조인 – 나열된 컬럼을 여러 레코드로 생성 case문 (0) | 2020.05.22 |
---|---|
Oracle - 데이터 연결의 다양한 방법 (0) | 2020.05.22 |
Oracle 특정 컬럼의 제품을 제품별, 등급별, 특정 등급으로 관리, 차액의 비율, CASE, ROLLUP, GROUP BY 활용 (0) | 2020.03.09 |
Oracle RATIO_TO_REPORT 전체실적에서 개인실적 비율구하기, WITH절 사용하기 (0) | 2020.03.09 |
Oracle ROLLUP, GROUPING SETS활용 TYPE 별 가격 합계, 소계 출력하기 (0) | 2020.03.09 |