개발/OracleDB

[SQL] CAL 테이블로 달력 출력하기

윤_ve 2021. 3. 16. 17:19

오늘은 캘린더 테이블로 달력모양으로 출력하는 걸 해보겠습니다.

sql developer에서 

SELECT * FROM CAL;

을 입력하면 아래와 같이 뜹니다.

 

이걸 

이런식으로 출력해보겠습니다.

 

우선, 

DECODE 함수를 사용해서 출력해보겟습니다.

 

SELECT 
    DECODE(DAY, 'SUN', DAYNO) "SUN"
    , DECODE(DAY, 'MON', DAYNO)"MON"
    , DECODE(DAY, 'TUE', DAYNO) "TUE"
    , DECODE(DAY, 'WED', DAYNO) "WED"
    , DECODE(DAY, 'THU', DAYNO) "THU"
    , DECODE(DAY, 'FRI', DAYNO) "FRI"
    , DECODE(DAY, 'SAT', DAYNO) "SAT"
FROM CAL;

 

이렇게 DAY가 해당 요일을 뜻하는 영단어와 동일 할 경우 해당 DAYNO을 출력하게 했습니다.

출력하면,

 

이런식으로 출력이 되는데 여기서 NULL 값을 지워줘야 합니다. 

NULL 값을 지워주기 위해서 GROUP함수를 사용합니다.

 

GROUP 함수에는

COUNT(COL) = 갯수

MAX(COL) = 최대값

MIN(COL) = 최솟값

SUM(COL) = 합

AVG(COL) =평균

STDDEV(COL) = 표준편차

VARIANCE(COL) = 분산

이런 함수들이 존재합니다.

 

우선 해당 값을 MAX 또는 MIN으로 묶어주도록합니다.

MAX와 MIN으로 묶으면 NULL값은 사라지고 해당 값이 나옵니다.

 

저는 MIN으로 묶어보겠습니다.

 

SELECT 
    MIN(DECODE(DAY, 'SUN', DAYNO)) "SUN"
    , MIN(DECODE(DAY, 'MON', DAYNO))"MON"
    , MIN(DECODE(DAY, 'TUE', DAYNO)) "TUE"
    , MIN(DECODE(DAY, 'WED', DAYNO)) "WED"
    , MIN(DECODE(DAY, 'THU', DAYNO)) "THU"
    , MIN(DECODE(DAY, 'FRI', DAYNO)) "FRI"
    , MIN(DECODE(DAY, 'SAT', DAYNO)) "SAT"
FROM CAL;

 

이대로 누르면 

이런 식으로 나오게 됩니다.

 

(MIN 값이 나오지 않는 이유는 현재 DAYNO 컬럼이 문자열 형태로 저장되어 있어서 ASC코드의 최대값이 출력되기 때문입니다.)

 

위 값들을 GROUP BY WEEKNO로 분류해줍니다.

 

SELECT 
    MIN(DECODE(DAY, 'SUN', DAYNO)) "SUN"
    , MIN(DECODE(DAY, 'MON', DAYNO))"MON"
    , MIN(DECODE(DAY, 'TUE', DAYNO)) "TUE"
    , MIN(DECODE(DAY, 'WED', DAYNO)) "WED"
    , MIN(DECODE(DAY, 'THU', DAYNO)) "THU"
    , MIN(DECODE(DAY, 'FRI', DAYNO)) "FRI"
    , MIN(DECODE(DAY, 'SAT', DAYNO)) "SAT"
FROM CAL
GROUP BY WEEKNO;

 

실행 하면

이렇게 달력 형태로 나오지만 역시 정렬이 되어 있지 않습니다.(위의 ASC코드와 같은이유로)

이럴 정렬하기 위해 ORDER BY 를 해주면 

 

원하는 형태로 출력이 됩니다.

 

전체쿼리↓↓

이상으로 CAL테이블로 달력 출력하기 였습니다.