Develope/교육

[Oracle] 3일차 ) 문제풀이

고로이 2018. 10. 2. 14:58
반응형
생각보다 문제가 난이도가 높아서...;;

기록할 겸 적어본다.




1. 사원의 성에서 처음 8자리를 표시하고 급여 액수를 별표로 나타내는 쿼리를 작성한다.

각 별을 1000 달러를 나타낸다. 급여의 내림차순으로 데이터를 출력한다.


RPAD 함수를 이용하면 된다. 



우선 substr을 통해 lastname을 8자리로 자른다.         => SUBSTR(last_name,1,8)

=> 해당 작업 하지 않아도 rpad에서 처리해준다고 한다.


처음 쓰이는 RPAD를 통해 이름부분을 8자리로 늘리고 => RPAD(last_name, 8, ' ')


두번째 쓰이는 RPAD를 통해 급여만큼 * 을 추가한다.   => RPAD(' ', ROUND(salary/1000), '*')



NAME + ' '

 *********************************

 앞의 8자리

급여만큼의 * 개수


SELECT RPAD(last_name, 8, ' ') || RPAD(' ',ROUND(salary/1000),'*'), salary

FROM employees;


결과
king     *********************** 24000
kochhar  **************** 17000
de haan  **************** 17000

참고로 rpad 앞쪽에 ''을 쓰면 null로 인식되어 실행되지 않는다.


아래 쿼리는 중간에 한 칸 띄우지 않기 위해 작성해 본 것



SELECT RPAD(RPAD(last_name, 8, ' ')8+ROUND(salary/1000),'*'), salary

FROM employees;


SELECT RPAD(last_name, 8, ' ') || RPAD('*',ROUND(salary/1000)-1,'*'), salary

FROM employees;






2. 사원의 성, 채용날짜, 근무 시작 요일을 표시한다.

월요일부터 시작하여 요일순으로 결과를 정렬하여 출력한다.


DATE 형식의 출력방식 중 

'DAY' 형식의 출력은 요일을 FULLNAME으로 표현하고,

'D' 형식의 출력은 요일을 숫자로 표현한다.


1

2

3

4

5

6

7


여기서 월요일부터 출력하기 위해 -1을 해준다.


SELECT last_name, hire_date, to_char(hire_date, 'DAY')

FROM employees

ORDER BY to_char(hire_date-1, 'D');



결과

Ladwig 14-JUL-03 MONDAY   

Cambrault 15-OCT-07 MONDAY   

Mallin 14-JUN-04 MONDAY 



3. 사원의 성이 'n'으로 끝나는 사원의 수를 나타내어라 (두가지)


1. where절의 like를 쓴다.

2. substr을 사용하여 마지막 글자를 추출한다.



SELECT count(*)

FROM employees

where substr(last_name, length(last_name), 1) = 'n'

;


SELECT count(*)

FROM employees

where last_name like '%n'





4. 02-04년도 입사한 사원의 입사년도에 따라 직무별로 총 급여를 표시하여라.


어렵다 이건..


SELECT job_id

, nvl(sum(case when to_char(hire_date,'yyyy') = '2002' then salary end ),0) as "2002"

, nvl(sum(case when to_char(hire_date,'yyyy') = '2003' then salary end ),0) as "2003"

, nvl(sum(case when to_char(hire_date,'yyyy') = '2004' then salary end ),0) as "2004"

FROM employees

where 1=1

and  to_char(hire_date,'yyyy') in ('2002','2003','2004')

group by job_id

order by job_id

;



SELECT job_id

, sum(case when to_char(hire_date,'yyyy') = '2002' then salary else 0 end ) as "2002"

, sum(case when to_char(hire_date,'yyyy') = '2003' then salary else 0 end ) as "2003"

, sum(case when to_char(hire_date,'yyyy') = '2004' then salary else 0 end ) as "2004"

FROM employees

where 1=1

and  to_char(hire_date,'yyyy') in ('2002','2003','2004')

group by job_id

order by job_id




출력


job_id                 2002    2003  2004  2005

AC_ACCOUNT  8300         0 0 0

AC_MGR        12008         0 0 0

AD_ASST               0   4400 0 0

반응형