2 정답
SELECT ranks, movie_name, sale_amt,
SUM(sale_amt) OVER () sum_amt,
CUME_DIST() OVER (ORDER BY sale_amt DESC) dist_amt
FROM box_office
WHERE YEAR(release_date) = 2019
AND ranks <= 10
ORDER BY ranks;
해설 WHERE 절에 개봉일이 2019년인 조건과 순위가 10위 이하인 조건을 기술하고 SELECT 절에서는 순위, 영화 제목, 매출액을 명시합니다. 연도별 총 매출액은 SUM() 함수로 구하는데, 2019년만 구하므로 PARTITION BY 절은 필요 없습니다. 조회되는 결과 집합 자체가 하나의 파티션이기 때문입니다. SUM() 함수는 전체 합계를 구하니 ORDER BY 절도 필요 없습니다. 전체 합은 오름차순이든 내림차순이든 모두 더하면 되기 때문이죠. 그러나 누적 분포 값을 구하는 CUME_DIST 함수는 매출액으로 내림차순 정렬해야 매출액이 큰 영화 순으로 누적 분포 값을 얻을 수 있습니다.
3 정답
CREATE OR REPLACE VIEW dept_emp_info_v AS
SELECT a.dept_name, b.emp_no, c.first_name, c.last_name
FROM departments a, dept_emp b, employees c
WHERE a.dept_no = b.dept_no
AND SYSDATE() BETWEEN b.from_date AND b.to_date
AND b.emp_no = c.emp_no;
해설 CREATE OR REPLACE VIEW 구문으로 dept_emp_info_v 뷰를 생성합니다. 이때 departments와 dept_emp 테이블을 조인해 부서에 속한 사번을 가져오는데, 현재 기준이므로 SYSDATE() BETWEEN b.from_date AND b.to_date라는 조건을 추가합니다. 그리고 dept_emp와 employees 테이블을 조인합니다.