SQL developer (orgacle 11g) 사용합니다.
먼저, 테이블 정보는 아래에, 예시는 첨부하였습니다.
CREATE TABLE actor(
id INTEGER NOT NULL,
name VARCHAR2(100),
CONSTRAINT actor_PK PRIMARY KEY (id));
CREATE TABLE movie(
id INTEGER NOT NULL,
title VARCHAR2(100),
yr NUMBER(4,0),
score NUMBER,
votes INTEGER,
director VARCHAR2(100),
CONSTRAINT movie_PK PRIMARY KEY (id));
CREATE TABLE casting(
movie_id INTEGER NOT NULL,
actor_id INTEGER NOT NULL,
ord INTEGER,
CONSTRAINT casting_PK PRIMARY KEY (movie_id, actor_id),
CONSTRAINT casting_FK1 FOREIGN KEY (movie_id) REFERENCES movie(id),
CONSTRAINT casting_FK2 FOREIGN KEY (actor_id) REFERENCES actor(id));
PL/SQL 작성하는 건데 2000년과 2013년 사이에 최소한 한 가지 영화에 출연했던 배우를 먼저 발견하고,
2000년에서 2013년 사이에 이 배우가 각각의 연도마다 출연했던 총 영화 수를 계산합니다 (예를 들면, 홍길동이란 배우는 2001년에 1개, 2002년에 2개...). 매년마다, 'x 배우는 z년도에 Y개의 영화에 출연했다.' 를 보여줘야 합니다. 배우가 출연한 영화가 없는 연도는 0을 리턴해야 합니다.
예를 들어, 배우 "홍길동"을 고르면, 결과는 아래와 같아야 한다.
홍길동 배우는 2000년도에 1개의 영화에 출연했다.
홍길동 배우는 2001년도에 2개의 영화에 출연했다.
홍길동 배우는 2002년도에 0개의 영화에 출연했다.
...
홍길동 배우는 2013년도에 1개의 영화에 출연했다.
http://gurubee.net/oracle/plsql - Oracle PL/SQL 강좌 목록
http://gurubee.net/lecture/1056 - FOR LOOP
http://gurubee.net/lecture/1065 - FOR문에서 커서 사용(Cursor FOR Loops)
SET SERVEROUTPUT ON; DECLARE CURSOR c1 IS SELECT DISTINCT a.id, a.name FROM movie m INNER JOIN casting c ON m.id = c.movie_id INNER JOIN actor a ON a.id = c.actor_id WHERE m.yr BETWEEN 2000 AND 2013 ORDER BY name ; v_cnt NUMBER(3); BEGIN FOR c2 IN c1 LOOP FOR v_yr IN 2000..2013 LOOP SELECT COUNT(*) INTO v_cnt FROM movie m INNER JOIN casting c ON m.id = c.movie_id WHERE m.yr = v_yr AND c.actor_id = c2.id ; DBMS_OUTPUT.PUT_LINE(c2.name || ' 배우는 ' || v_yr || '년도에 ' || v_cnt || '개의 영화에 출연했다.'); END LOOP; END LOOP; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('(' || SQLCODE || ')' || SQLERRM); END; /