본문 바로가기

Oracle/12일

12일차 5

흐름제어 (decode, simpled case, searched case)

내년 급여인상 IT_PROG *1.2,  ST_CLERK *1.1, AD_VP* 1.15,  etc *1.05 뽑아보기

SELECT last_name, job_id, salary AS 올해급여,
      DECODE(job_id,  'IT_PROG',  salary * 1.2,  
                      'ST_CLERK', salary * 1.1, 
                      'AD_VP',    salary * 1.15, 
                                  salary * 1.05)  as 내년급여
FROM employees;
SELECT last_name, job_id, salary as 올해급여,
      CASE job_id WHEN 'IT_PROG'  THEN  salary * 1.2  
                  WHEN 'ST_CLERK' THEN  salary * 1.1 
                  WHEN 'AD_VP'    THEN  salary * 1.15 
                                  ELSE  salary * 1.05
                  END as 내년급여
FROM employees;
SELECT last_name, job_id, salary AS 올해급여,
      CASE  WHEN  job_id ='IT_PROG'   THEN  salary * 1.2  
            WHEN  job_id ='ST_CLERK'  THEN  salary * 1.1
            WHEN  job_id ='AD_VP'     THEN  salary * 1.15
                                      ELSE  salary * 1.05
            END AS 내년급여
FROM employees;
 LAST_NAME JOB_ID     올해급여  내년급여
 --------- ---------- ----- -----
 King      AD_PRES    24000 25200
 Kochhar   AD_VP      17000 19550
 De_Haan   AD_VP      17000 19550
 Hunold    IT_PROG     9000 10800
 Ernst     IT_PROG     6000  7200
 Lorentz   IT_PROG     4200  5040
 Mourgos   ST_MAN      5800  6090
 Rajs      ST_CLERK    3500  3850
 Davies    ST_CLERK    3100  3410
 Matos     ST_CLERK    2600  2860
 Vargas    ST_CLERK    2500  2750
 Zlotkey   SA_MAN     10500 11025
 Abel      SA_REP     11000 11550
 Taylor    SA_REP      8600  9030
 Grant     SA_REP      7000  7350
 Whalen    AD_ASST     4400  4620
 Hartstein MK_MAN     13000 13650
 Fay       MK_REP      6000  6300
 Higgins   AC_MGR     12000 12600
 Gietz     AC_ACCOUNT  8300  8715


문제1. 사원번호 짝수면 백군, 홀수면 청군(last_name (백군))

SELECT last_name, employee_id, MOD(employee_id,2),
  DECODE(MOD(employee_id,2),  0,  last_name||'(백군)',
                                  last_name||'(청군)') AS ans
FROM employees;
SELECT last_name, employee_id, MOD(employee_id,2),
  CASE MOD(employee_id,2) WHEN 0 THEN last_name||'(백군)'
                          ELSE last_name||'(청군)'
  END AS ans
FROM employees;
SELECT last_name, employee_id, MOD(employee_id,2),
  CASE WHEN MOD(employee_id,2) = 0 THEN last_name||'(백군)'
       ELSE last_name||'(청군)'
  END AS ans
FROM employees;
 EMPLOYEE_ID EMPLOYEE_ID MOD(EMPLOYEE_ID,2) ANS
 ----------- ----------- ------------------ -------------
         100         100                  0 King(백군)
         101         101                  1 Kochhar(청군)
         102         102                  0 De_Haan(백군)
         103         103                  1 Hunold(청군)
         104         104                  0 Ernst(백군)
         107         107                  1 Lorentz(청군)
         124         124                  0 Mourgos(백군)
         141         141                  1 Rajs(청군)
         142         142                  0 Davies(백군)
         143         143                  1 Matos(청군)
         144         144                  0 Vargas(백군)
         149         149                  1 Zlotkey(청군)
         174         174                  0 Abel(백군)
         176         176                  0 Taylor(백군)
         178         178                  0 Grant(백군)
         200         200                  0 Whalen(백군)
         201         201                  1 Hartstein(청군)
         202         202                  0 Fay(백군)
         205         205                  1 Higgins(청군)
         206         206                  0 Gietz(백군)

 

문제2 salary 등급(low:0~10000, Mid:10001~20000, High:20001~)

SELECT last_name, salary, CEIL(salary/10000),
  DECODE(CEIL(salary/10000),  1,  'Low',
                              2,  'Mid',
                                  'High') AS sal_grade
FROM employees;
 LAST_NAME SALARY CEIL(SALARY/10000) SAL_GRADE
 --------- ------ ------------------ ---------
 King       24000                  3 High
 Kochhar    17000                  2 Mid
 De_Haan    17000                  2 Mid
 Hunold      9000                  1 Low
 Ernst       6000                  1 Low
 Lorentz     4200                  1 Low
 Mourgos     5800                  1 Low
 Rajs        3500                  1 Low
 Davies      3100                  1 Low
 Matos       2600                  1 Low
 Vargas      2500                  1 Low
 Zlotkey    10500                  2 Mid
 Abel       11000                  2 Mid
 Taylor      8600                  1 Low
 Grant       7000                  1 Low
 Whalen      4400                  1 Low
 Hartstein  13000                  2 Mid
 Fay         6000                  1 Low
 Higgins    12000                  2 Mid
 Gietz       8300                  1 Low
SELECT last_name, salary, TRUNC((salary-1)/10000),
    DECODE(TRUNC((salary-1)/10000), 0,  'Low',
                                    1,  'Mid',
                                    'High') AS sal_grade
FROM employees;
LAST_NAME SALARY TRUNC((SALARY-1)/10000) SAL_GRADE
 --------- ------ ----------------------- ---------
 King       24000                       2 High
 Kochhar    17000                       1 Mid
 De_Haan    17000                       1 Mid
 Hunold      9000                       0 Low
 Ernst       6000                       0 Low
 Lorentz     4200                       0 Low
 Mourgos     5800                       0 Low
 Rajs        3500                       0 Low
 Davies      3100                       0 Low
 Matos       2600                       0 Low
 Vargas      2500                       0 Low
 Zlotkey    10500                       1 Mid
 Abel       11000                       1 Mid
 Taylor      8600                       0 Low
 Grant       7000                       0 Low
 Whalen      4400                       0 Low
 Hartstein  13000                       1 Mid
 Fay         6000                       0 Low
 Higgins    12000                       1 Mid
 Gietz       8300                       0 Low


cf.decode안에 decode

SELECT last_name, salary, CEIL(salary/10000),
  DECODE(CEIL(salary/10000),  1,  DECODE(salary, 2500, 'T^T', 'Low'),
                              2,  'Mid',
                                  'High') AS sal_grade
FROM employees;
 LAST_NAME SALARY CEIL(SALARY/10000) SAL_GRADE
 --------- ------ ------------------ ---------
 King       24000                  3 High
 Kochhar    17000                  2 Mid
 De_Haan    17000                  2 Mid
 Hunold      9000                  1 Low
 Ernst       6000                  1 Low
 Lorentz     4200                  1 Low
 Mourgos     5800                  1 Low
 Rajs        3500                  1 Low
 Davies      3100                  1 Low
 Matos       2600                  1 Low
 Vargas      2500                  1 T^T
 Zlotkey    10500                  2 Mid
 Abel       11000                  2 Mid
 Taylor      8600                  1 Low
 Grant       7000                  1 Low
 Whalen      4400                  1 Low
 Hartstein  13000                  2 Mid
 Fay         6000                  1 Low
 Higgins    12000                  2 Mid
 Gietz       8300                  1 Low

 
SELECT last_name, salary, 
  CASE CEIL(salary/10000) WHEN 1 THEN 'Low'
                          WHEN 2 THEN 'Mid'
                          ELSE 'High'
  END AS sal_grade
FROM employees;
SELECT last_name, salary, 
  CASE  WHEN 0<= salary AND salary<=10000 THEN 'Low'
        WHEN 10000<salary AND salary<=20000 THEN 'Mid'
        ELSE 'High'
  END AS sal_galde
FROM employees;
 LAST_NAME SALARY SAL_GALDE
 --------- ------ ---------
 King       24000 High
 Kochhar    17000 Mid
 De_Haan    17000 Mid
 Hunold      9000 Low
 Ernst       6000 Low
 Lorentz     4200 Low
 Mourgos     5800 Low
 Rajs        3500 Low
 Davies      3100 Low
 Matos       2600 Low
 Vargas      2500 Low
 Zlotkey    10500 Mid
 Abel       11000 Mid
 Taylor      8600 Low
 Grant       7000 Low
 Whalen      4400 Low
 Hartstein  13000 Mid
 Fay         6000 Low
 Higgins    12000 Mid
 Gietz       8300 Low

.
.
.
.
.

'Oracle > 12일' 카테고리의 다른 글

12일차 1  (0) 2012.09.20
12일차 2  (0) 2012.09.20
12일차 3  (0) 2012.09.20
12일차 4  (0) 2012.09.20
12일차 6  (0) 2012.09.20