본문 바로가기

Programming/DB

ORACLE 로또 번호 추출하기 - 로또 SQL

반응형
- 로또 쿼리 구성 

 

 

SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= 45;

 

일단 45까지의 계층을 나눈다.

1~45 까지의 행이 생길텐데 얘를 한 그룹으로 만들어 주기 위해 

1~45 까지 1 그룹, 46~90 까지 2 그룹.. 이런식으로 나누기 위해 

LEVEL 을 45로 나누고 CEIL (올림함수) 를 사용하여 그룹을 나눈다. 

 

SELECT CEIL(LEVEL / 45)
FROM DUAL
CONNECT BY LEVEL <= 45 * 2;

 

그럼 1~45번 까지 1로 묶였고, 46~90 까지는 2로 세팅한다.

 

결과값

 

이제 그룹별 랜덤 자연수 (1~45) 를 지정해야하니 MOD(LEVEL - 1, 45) + 1 로 수를 나열한다.

 

그룹별 그리고 랜덤함수를 사용하여 어센딩 해준다.

 

SELECT CEIL(LEVEL / 45) AS GRP
       ,MOD(LEVEL - 1, 45) + 1 AS NUM
FROM DUAL
CONNECT BY LEVEL <= 45 * 2
ORDER BY 1, DBMS_RANDOM.VALUE

 

결과값

 

이렇게 숫자가 무작위로 정렬되는걸 볼 수 있다.

이 숫자들 중 보너스 번호 포함 6개 까지 한 그룹으로 매핑해야 하니 

GROUP BY 를 통해 묶어주도록하자.

 

SELECT GRP
      ,NUM
FROM (
    SELECT GRP
          ,NUM
          ,MOD(ROWNUM - 1, 45) + 1 AS RNUM
    FROM (
        SELECT CEIL(LEVEL / 45) AS GRP
              ,MOD(LEVEL - 1, 45) + 1 AS NUM
        FROM DUAL
        CONNECT BY LEVEL <= 45 * 2
        ORDER BY 1, DBMS_RANDOM.VALUE
         )
      )
WHERE RNUM <= 6
ORDER BY GRP, NUM;

 

결과값

 

이제 행을 열로 만들 차례이다. 

SELECT MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 1, NUM)) AS NO1,
       MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 2, NUM)) AS NO2,
       MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 3, NUM)) AS NO3,
       MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 4, NUM)) AS NO4,
       MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 5, NUM)) AS NO5,
       MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 6, NUM)) AS NO6
FROM (
        SELECT GRP
              ,NUM
        FROM (
            SELECT GRP
                  ,NUM
                  ,MOD(ROWNUM - 1, 45) + 1 AS RNUM
            FROM (
                SELECT CEIL(LEVEL / 45) AS GRP
                      ,MOD(LEVEL - 1, 45) + 1 AS NUM
                FROM DUAL
                CONNECT BY LEVEL <= 45 * 2
                ORDER BY 1, DBMS_RANDOM.VALUE
            )
        )
        WHERE RNUM <= 6
        ORDER BY GRP, NUM
    )
GROUP BY GRP
ORDER BY 1;

 

결과값

 

이렇게 2줄 구매예상번호로 2줄 랜덤번호가 생성되었다.

CONNECT BY LEVEL <=  45 * ? 구문에서 원하는 구매횟수를 넣어 입력하면 된다.

반응형

 

반응형