문제/SQL

231031 PL/SQL 복습 겸 문제

잇꼬 2023. 10. 31. 10:44
728x90
반응형
SMALL

[문제] 2006년도에 입사한 사원들의 근무 도시이름별로 급여의 총액, 평균을 출력하세요. 

< 화면 출력 >

Southlake 도시에 근무하는 사원들의 총액 급여는 ₩13,800 이고 평균급여는 ₩6,900입니다.
South San Francisco 도시에 근무하는 사원들의 총액 급여는 ₩37,800 이고 평균급여는 ₩2,907입니다.
Seattle 도시에 근무하는 사원들의 총액 급여는 ₩7,800 이고 평균급여는 ₩7,800입니다.
Seattle 도시에 근무하는 사원들의 총액 급여는 ₩2,600 이고 평균급여는 ₩2,600입니다.
Oxford 도시에 근무하는 사원들의 총액 급여는 ₩59,100 이고 평균급여는 ₩8,442입니다.

 

 

1. 먼저, SELECT문으로 실행.

SELECT city, sum(sumsal) sumsal, avg(avgsal) avgsal
FROM ( SELECT l.city, e.sumsal, e.avgsal
       FROM 
            ( SELECT department_id, sum(salary) sumsal, trunc(avg(salary)) avgsal
              FROM hr.employees
              WHERE hire_date >= to_date('20060101', 'yyyymmdd')
              AND hire_date < to_date('20070101', 'yyyymmdd')
              GROUP BY department_id ) e , hr.departments d, hr.locations l
              WHERE e.department_id = d.department_id
              AND d.location_id = l.location_id)
GROUP BY city;

PL/SQL 실행

방법1)

DECLARE
    CURSOR city_aggr_cur IS 
        SELECT l.city, e.sumsal, e.avgsal
        FROM ( SELECT department_id, sum(salary) sumsal, trunc(avg(salary)) avgsal
               FROM hr.employees
               WHERE hire_date >= to_date('20060101', 'yyyymmdd')
               AND hire_date < to_date('20070101', 'yyyymmdd')
               GROUP BY department_id ) e , hr.departments d, hr.locations l
        WHERE e.department_id = d.department_id
        AND d.location_id = l.location_id ;
        
        v_rec city_aggr_cur%ROWTYPE;
BEGIN
    OPEN city_aggr_cur;
    
    LOOP
        FETCH city_aggr_cur INTO v_rec;
        EXIT WHEN city_aggr_cur%NOTFOUND;
        
        dbms_output.put_line(v_rec.city||' 도시에 근무하는 사원들의 총액 급여는 '||ltrim(to_char(v_rec.sumsal,'l999,999'))||' 이고 평균급여는 '||ltrim(to_char(v_rec.avgsal, 'l999,999'))||'입니다.');
    END LOOP;
    
    CLOSE city_aggr_cur;
END;
/

 

방법2)

DECLARE
    CURSOR city_aggr_cur IS 
        SELECT l.city, e.sumsal, e.avgsal
        FROM ( SELECT department_id, sum(salary) sumsal, trunc(avg(salary)) avgsal
               FROM hr.employees
               WHERE hire_date >= to_date('20060101', 'yyyymmdd')
               AND hire_date < to_date('20070101', 'yyyymmdd')
               GROUP BY department_id ) e , hr.departments d, hr.locations l
        WHERE e.department_id = d.department_id
        AND d.location_id = l.location_id ;
        
BEGIN
    
    FOR v_rec IN city_aggr_cur LOOP 
        dbms_output.put_line(v_rec.city||' 도시에 근무하는 사원들의 총액 급여는 '||ltrim(to_char(v_rec.sumsal,'l999,999'))||' 이고 평균급여는 '||ltrim(to_char(v_rec.avgsal, 'l999,999'))||'입니다.');
    END LOOP;
    
END;
/

 

방법3) 

BEGIN
    
    FOR v_rec IN ( SELECT l.city, e.sumsal, e.avgsal
                    FROM ( SELECT department_id, sum(salary) sumsal, trunc(avg(salary)) avgsal
                           FROM hr.employees
                           WHERE hire_date >= to_date('20060101', 'yyyymmdd')
                           AND hire_date < to_date('20070101', 'yyyymmdd')
                           GROUP BY department_id ) e , hr.departments d, hr.locations l
                    WHERE e.department_id = d.department_id
                    AND d.location_id = l.location_id ) LOOP 
        dbms_output.put_line(v_rec.city||' 도시에 근무하는 사원들의 총액 급여는 '||ltrim(to_char(v_rec.sumsal,'l999,999'))||' 이고 평균급여는 '||ltrim(to_char(v_rec.avgsal, 'l999,999'))||'입니다.');
    END LOOP;
    
END;
/
728x90
반응형
LIST

'문제 > SQL' 카테고리의 다른 글

231031 PL/SQL 문제  (0) 2023.10.31
231031 복습 겸 문제  (1) 2023.10.31
231030 PL/SQL 복습 겸 문제  (1) 2023.10.30
231030 PL/SQL 복습  (0) 2023.10.30
231027 PL/SQL 복습 겸 문제  (0) 2023.10.30