안녕하세요.
이번에 합격자 선발하는 SELECT 쿼리를 작성 하려고 했는데 방법이 떠오르지 않아서 글을 작성합니다.
자료는 ID, 점수, 1지망, 2지망, 3지망 이렇게 있습니다.
점수가 높은 순으로 1지망이 배정되고, 1지망 인원이 채워졌으면 2지망으로 인원 확인하여 배정되고,
2지망의 인원이 채워졌으면 3지망으로 인원 확인하여 배정되는 방법 입니다.
1지망 , 2지망, 3지망이 같을 수도 있습니다.
지원 정원은 A01 : 4명, B01 : 3명, C01 : 3명, 총 10명 입니다.
WITH T (ID, POINT, APP_1, APP_2, APP_3) AS
(
SELECT '0001', '90', 'B01', 'A01', 'C01' FROM DUAL UNION ALL
SELECT '0002', '89', 'B01', 'A01', 'C01' FROM DUAL UNION ALL
SELECT '0003', '87', 'C01', 'B01', 'B01' FROM DUAL UNION ALL
SELECT '0004', '87', 'A01', 'C01', 'B01' FROM DUAL UNION ALL
SELECT '0005', '84', 'B01', 'A01', 'C01' FROM DUAL UNION ALL
SELECT '0006', '82', 'A01', 'A01', 'B01' FROM DUAL UNION ALL
SELECT '0007', '81', 'B01', 'C01', 'A01' FROM DUAL UNION ALL
SELECT '0008', '80', 'A01', 'A01', 'A01' FROM DUAL UNION ALL
SELECT '0009', '77', 'B01', 'B01', 'B01' FROM DUAL UNION ALL
SELECT '0010', '76', 'A01', 'A01', 'B01' FROM DUAL UNION ALL
SELECT '0011', '73', 'B01', 'A01', 'C01' FROM DUAL UNION ALL
SELECT '0012', '71', 'C01', 'A01', 'B01' FROM DUAL
)
SELECT * FROM T
;
위의 자료가 아래처럼 나오면 됩니다.
ID POINT APP_1 APP_2 APP_3 PASS
0001 90 B01 A01 C01 B01
0002 89 B01 A01 C01 B01
0003 87 C01 B01 B01 C01
0004 87 A01 C01 B01 A01
0005 84 B01 A01 C01 B01
0006 82 A01 A01 B01 A01
0007 81 B01 C01 A01 C01
0008 80 A01 A01 A01 A01
0009 77 B01 B01 B01
0010 76 A01 A01 B01 A01
0011 73 B01 A01 C01 C01
0012 71 C01 A01 B01
PASS는 선발된 지원코드 입니다.
값이 없으면 선발되지 않은 것입니다.
* 제가 해결하지 못한 숙제를 적어놓지 않았네요.
포인트는 0011번 지원자와 0012번 지원자의 선발결과 입니다.
점수 순으로 배정을 해야 하다 보니 0011번의 3지망이 0012번의 1지망 보다 우선되어져서
0011번에게 C01이 배정되고 0012번은 탈락 되었습니다.
예제에서는 총10명만 선발하므로 10명으로 제한하여 해결할 수도 있지만
인원이 많아지고 0011번의 경우가 많이 발생되면 그 방법도 해결책이라 할 수 없을 것 같습니다.
많은 아이디어 주시기 바랍니다.
|