백분률을 관리하는 데이터를 출력을 위해 TO_CHAR변환 함수를 사용하는 경우를 설명하고자 합니다
백분률은 숫자형 데이터형이며 고객의 요구에 따라 TO_CHAR로 화면에 출력해주는 경우가 있습니다
고객의 요구가 다음과 같을 경우 처리하는 방법에 대해서 설명하고자 합니다
백분률 처리시
소숫점자리 처리 : 소숫점 둘째자리까지 출력(반올림없이 버림), 출력값이 없을경우 0으로 채움,
정수자리 : 십의자리가 없을 경우 0으로 채움
예) 값 : 1 , 출력값 : 01.00
값 : 100, 출력값 : 100.00
값 : 50.2474 , 출력값 : 50.24
우선 아래 형태로 샘플데이터를 만듭니다
SELECT RNUM
,PER
FROM ( SELECT 1 RNUM, 1 PER FROM DUAL
UNION ALL
SELECT 2 RNUM, 100 PER FROM DUAL
UNION ALL
SELECT 3 RNUM, 50.2474 PER FROM DUAL
) SAMPLE
TO_CHAR의 포멧 스트링 '9'와 '.'콤마 을 통해 처리하도록 합니다
SELECT RNUM
,PER
,TO_CHAR(PER,'FM999.99') FORMAT1
FROM ( SELECT 1 RNUM, 1 PER FROM DUAL
UNION ALL
SELECT 2 RNUM, 100 PER FROM DUAL
UNION ALL
SELECT 3 RNUM, 50.2474 PER FROM DUAL
) SAMPLE
위 쿼리를 조회하면 다음과 같은 결과가 나옵니다
RNUM | PER | FORMAT1 |
1 | 1 | 1. |
2 | 100 | 100. |
3 | 50.2474 | 50.25 |
고객의 요청에 의한 십의자리수 0으로 채우고 , 소숫점 자리수 두자리 0으로 채우는것이 충족되지가 않습니다
다음과 같이 포멧스트링에 9대신 0으로 채워봅니다
SELECT RNUM
,PER
,TO_CHAR(PER,'FM999.99') FORMAT1
,TO_CHAR(PER,'FM000.00') FORMAT2
FROM ( SELECT 1 RNUM, 1 PER FROM DUAL
UNION ALL
SELECT 2 RNUM, 100 PER FROM DUAL
UNION ALL
SELECT 3 RNUM, 50.2474 PER FROM DUAL
) SAMPLE
RNUM | PER | FORMAT1 | FORMAT2 |
1 | 1 | 1. | 001.00 |
2 | 100 | 100. | 100.00 |
3 | 50.2474 | 50.25 | 050.25 |
0을 정수 3째자리까지 채우니 3째자리까지 0으로 채우는것이 고정되며 3번행의, 50.2474의 소숫점 2째자리가 반올림되어 산출되어있는 문제가 있어 다음과 같이 변경합니다
SELECT RNUM
,PER
,TO_CHAR(PER,'FM999.99') FORMAT1
,TO_CHAR(PER,'FM000.00') FORMAT2
,TO_CHAR(PER,'FM900.00') FORMAT3
FROM ( SELECT 1 RNUM, 1 PER FROM DUAL
UNION ALL
SELECT 2 RNUM, 100 PER FROM DUAL
UNION ALL
SELECT 3 RNUM, TRUNC(50.2474,2) PER FROM DUAL
) SAMPLE
RNUM | PER | FORMAT1 | FORMAT2 | FORMAT3 |
1 | 1 | 1. | 001.00 | 01.00 |
2 | 100 | 100. | 100.00 | 100.00 |
3 | 50.2474 | 50.25 | 050.25 | 50.24 |
3번째 포멧에 와서야 제대로 표현되는것 같습니다
필수적으로 자리수를 보전하고 싶을 때는 포멧스트링을 '0'으로 기재하고
있거나 없거나 한 숫자를 표현할때는 '9'로 표현한다는것을 알 수 있습니다
기본적으로 TO_CHAR에서 소숫점 반올림 처리가 되므로 버림처리를 하셔야 할 경우 원본 칼럼에서 TRUNC 함수로 필요한 자리수를 기재하여 TO_CHAR 변환하셔야됩니다
그런데 포멧스트링에 왜 FM을 붙이는지 의문이 있으신 분들은 아래 SQL을 돌려 결과를 보시면
FM은 포멧스트링의 공백을 없애는 접두어라는것을 확인하실 수 있습니다
SELECT RNUM
,PER
,REPLACE(FORMAT1,' ','@') FORMAT1_REPL
,REPLACE(FORMAT2,' ','@') FORMAT2_REPL
FROM(
SELECT RNUM
,PER
,TO_CHAR(PER,'900.00') FORMAT1
,TO_CHAR(PER,'FM900.00') FORMAT2
FROM ( SELECT 1 RNUM, 1 PER FROM DUAL
UNION ALL
SELECT 2 RNUM, 100 PER FROM DUAL
UNION ALL
SELECT 3 RNUM, TRUNC(50.2474,2) PER FROM DUAL
) SAMPLE
)
TO_CHAR로 변환한 데이터의 공백을 '@'로 치환하는 내용인데요
FM이 없는 FORMAT1 FORMAT1_REPL에 공백이 2개씩 들어가 있는것을 볼 수 있습니다
포멧부여시 들어가는 공백을 'FM'접두어가 없으면 프로그램으로 전달 시 공백까지 같이 전달되므로
반드시 'FM' 접두어를 붙여주시길 바랍니다
RNUM | PER | FORMAT1_REPL | FROMAT2_REPL |
1 | 1 | @@1.00 | 01.00 |
2 | 100 | @@100.00 | 100.00 |
3 | 50.2474 | @@50.24 | 50.24 |
이상 백분률을 TO_CHAR로 전환하는 포스팅을 마칩니다
'DB활용' 카테고리의 다른 글
[오라클 계층구조] 게시판 댓글&대댓글 구현 (3) | 2020.01.15 |
---|---|
[오라클 그룹쿼리] GROUP BY GROUPING SETS 활용하기 (0) | 2020.01.09 |
[오라클 계층형구조] 행정표준코드(기관) 조직 목록 계층구조 활용 2 (0) | 2020.01.07 |
[오라클 계층형구조] 행정표준코드(기관) 조직 목록 계층구조 활용 1 (0) | 2020.01.01 |
[오라클 함수활용]IS_DATE를 활용한 날짜 예외처리 및 조회 (0) | 2020.01.01 |
댓글