본문 바로가기
Coding Note/SQL

SQL 특수 query (CASE 구문) / DECODE 함수 / SUBSTR 함수 / ROWNUM으로 순위 구하기 / SUB QUERY 사용해서 순위 구하기

by 푸린이 2021. 12. 27.

* CASE 구문 == switch

-- 방법1
SELECT employee_id, first_name, phone_number,
    CASE SUBSTR(phone_number, 1, 3)
        WHEN '515' THEN '서울'
        WHEN '590' THEN '부산'
        WHEN '650' THEN '광주'
        ELSE '기타'
    END as "지역"
FROM employees;

-- 방법2
SELECT employee_id, first_name, phone_number,
    CASE 
        WHEN SUBSTR(phone_number, 1, 3) = '515' THEN '서울'
        WHEN SUBSTR(phone_number, 1, 3) = '590' THEN '부산'
        WHEN SUBSTR(phone_number, 1, 3) = '650' THEN '광주'
        ELSE '기타'
    END AS 지역
FROM employees;

- SUBSTR("문자열", "시작위치", "길이") : 문자열을 시작위치부터 길이만큼 자르는 함수

- CASE ~ END로 마무리, ALIAS 설정 가능(지역)

- WHEN 일 때, THEN으로 출력

 

* DECODE 함수

DECODE(컬럼, 조건1, 결과1, 조건2, 결과2, 조건3, 결과3..........) 

SELECT employee_id, first_name, phone_number,
    DECODE(SUBSTR(phone_number, 1, 3),
        '515', '서울',
        '590', '부산',
        '650', '광주',
        '기타'
    ) AS 지역
FROM employees;

- else로 쓰는 '기타'가 없으면 null로 출력된다

- 출력 결과는 위의 CASE구문과 같다.

 

* 분석 함수

    - 순위 함수 
    RANK()
    DENSE_RANK()
    ROW_NUMBER()
    ROWNUM(함수아님)        -- 번호를 매겨줌

 

-- 급여 랭킹 TOP10을 구하라

SELECT ROWNUM, employee_id, first_name
FROM employees
WHERE ROWNUM <= 10;

- ROWNUM이 번호를 매겨주지만, employee_id 순서대로 줄 세운 것에 불과함

SELECT ROWNUM, employee_id, first_name
FROM employees
WHERE ROWNUM >= 11 AND ROWNUM <= 20;

- 게다가 두개의 조건이 들어갔을 땐 동작하지 않음

 

-- SUB QUERY를 사용하여 순위 구하기

1. 급여의 순위 → 정렬
2. 번호 지정 → ROWNUM
3. 범위 지정

SELECT RNUM, employee_id, first_name, salary
FROM    
    (SELECT ROWNUM AS RNUM, employee_id, first_name, salary      -- 2. 번호 지정 (정렬된 부분에 번호를 매겨줌)
     FROM
        (SELECT employee_id, first_name, salary     -- 1. 급여의 순위
         FROM employees
         ORDER BY salary DESC)
     )
WHERE RNUM >= 1 AND RNUM <= 10;     -- 3. 범위 지정

댓글