아래의 SQL을 가지고 로또번호를 생성해 봅시다.
– ? 부분에 들어갈 적절한 함수를 찾으세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
SELECT ?(LEVEL/45) dep, ?(LEVEL - 1 , 45) + 1 num FROM DUAL CONNECT BY LEVEL <= 45 * 5 ORDER BY 1, DBMS_RANDOM.VALUE --결과 NO1 NO2 NO3 NO4 NO5 NO6 ---- ---------- ---------- ---------- ---------- ---------- 1 5 11 17 23 43 2 13 15 20 23 37 2 9 21 23 26 43 12 15 24 27 32 41 9 12 15 23 25 33 |
1.문제 풀이
2.풀이 과정
3.결과
10월 24일 정답을 올리도록 하겠습니다.
About the Author
View all posts by 김지룡● (주)더비소프트 SI&ITO사업부 / ERP사업팀 팀원
● 경력 5년(현 LG전자 GERP DBA/Tuning 업무)
● 경력 5년(현 LG전자 GERP DBA/Tuning 업무)
더비 첫 퀴즈게시물에 재미난 문제를 내준 김지룡 대리님께 감사드립니다.
이 문제를 통해 나온 로또번호로 이번주에 당첨되면 좋겠네요 ^^
답은 2가지 버전으로 접근해 보았으며, 참고로 PIVOT 키워드를 사용하여 11g 이상 수행이 가능합니다.
1. UNION ALL 활용 버전
- UNION ALL 키워드를 사용하여 수행했는데 단점은 게임횟수를 상수로 넣어야 해서 프로그래밍적으로는 문제가 있는 버전입니다.
2. 게임횟수 도입
- 게임횟수를 도입하여 Input 값에 따라 로또게임 횟수만큼 출력되도록 하였으며 총 12회를 진행해 보았습니다.
일단 원하는 결과는 나왔는데 다른분들이 접근하는 방법도 기대가 됩니다.
앞으로도 재마난 퀴즈 많이 제공해 주시기 바랍니다.
감사합니다.
* 지룡대리가 준 Sample 데이타를 보면 5게임으로 한정 되어 있지만.. 저는 10게임으로 했습니다^^
1. 로또 번호를 생성 하기 위해 필요한 데이타를 생성 합니다.
2. 열로 구성되어 있는 데이터를 행으로 만들기 위한 기준 데이터 생성
3. 열로 되어 있는 것을 행으로 데이터 변환.(CASE함수를 써도 무방함.)
위 결과를 보면 우리가 원하는 결과 값으로 나오지 않고 NULL 값과 함께 나오게 됩니다.
이유는 오라클은 행 단위로 데이터를 처리 하기 때문 인데요.. DELCODE 함수를 통해 행으로 변형 할때..
DECODE(HEIGHT, 1, NUM) AS “No1″ < -- 해당 조건에서 HEIGHT = 1 조건에 만족하는 값 리턴, 조건에 만족하지 않는 값은 NULL 값으로 치환을 합니다. 만일 DECODE(HEIGHT, 1, NUM, 0) AS "No1" 로 쓰게 되면.. NULL값대신.. 0라는 숫자가 찍힐 것 입니다. 결론적으로 위 결과는 우리가 원하는 결과의 값이 아닙니다. 그래서 이를 해결하기 위해.. 그룹함수를 이용하여.. 해결 할 수 있습니다. 그룹함수의 특징 중 하나가 NULL값을 취급하지 않습니다. GAME컬럼을 기준으로 No1 컬럼을 그룹을 묶게 되면 NULL값을 제외한 나머지 값.. 즉, 값만 리턴하게 될 것입니다. 아래 결과를 확인 합시다.. 4. 최종 결과....
GAME이라는 값을 그룹핑하여 그룹함수를 써줌으로써 NULL값은 해결되고.. 우리가 원하는 결과가 나오게 됩니다. 감사합니다.
집에 Oracle 10g가 깔려있어서.. 10g기준으로 작성하였습니다 ^^;
(답글을 늦게 올려 죄송합니다..)
-로또 번호 생성 퀴즈 풀이 및 정답