티스토리 뷰
테이블의 컬럼 중 발행금액, 입금액 등을 계산해서 미수금 컬럼값 sql문장으로 자동 넣어주기 (COALESCE)
Coding Life 2024. 8. 25. 08:14컬럼이 만들다보니 160개가 넘어가는 공사관련 테이블인데, 화면에 미수금을 보여주려고 하니. 좀 복잡하네요.
아래의 코드로 각 varchar(15)로 선언된 컬럼의 값을 계산하는 sql 명령어인데,
도움이 될 것 같아 올려봅니다.
UPDATE work
SET sum_receivable = (
COALESCE(CAST(REPLACE(bill1, ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(bill2, ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(bill3, ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(bill4, ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(bill5, ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(bill6, ',', '') AS DECIMAL(15, 2)), 0)
) - (
COALESCE(CAST(REPLACE(deposit1, ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(deposit2, ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(deposit3, ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(deposit4, ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(deposit5, ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(deposit6, ',', '') AS DECIMAL(15, 2)), 0)
);
위의 쿼리로 하니 경고가 나옵니다.
위의 코드를 실행하니, 아래의 경고가 나오지만, 계산은 된것 같은데 맞는가?
Warning: #1292 Truncated incorrect DECIMAL value: ''
UPDATE work
SET sum_receivable = (
COALESCE(CAST(REPLACE(NULLIF(bill1, ''), ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(NULLIF(bill2, ''), ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(NULLIF(bill3, ''), ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(NULLIF(bill4, ''), ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(NULLIF(bill5, ''), ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(NULLIF(bill6, ''), ',', '') AS DECIMAL(15, 2)), 0)
) - (
COALESCE(CAST(REPLACE(NULLIF(deposit1, ''), ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(NULLIF(deposit2, ''), ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(NULLIF(deposit3, ''), ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(NULLIF(deposit4, ''), ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(NULLIF(deposit5, ''), ',', '') AS DECIMAL(15, 2)), 0) +
COALESCE(CAST(REPLACE(NULLIF(deposit6, ''), ',', '') AS DECIMAL(15, 2)), 0)
);
경고메시지가 나와서 다시 실행했는데, 위의 결과 이미지에서 보듯이 깨끗하게 잘되네요.
이 경고 메시지, Warning: #1292 Truncated incorrect DECIMAL value: '',는 SQL이 빈 문자열('')을 DECIMAL 형으로 변환하려 할 때 발생합니다. 빈 문자열은 DECIMAL 형으로 직접 변환할 수 없기 때문에 이 경고가 발생합니다. 하지만 COALESCE 함수로 인해, 빈 문자열이 0으로 대체되었기 때문에 계산 자체는 정상적으로 수행되었을 가능성이 큽니다.
다만, 이 경고를 완전히 제거하고 정확한 처리를 위해, IFNULL 또는 NULLIF와 같은 함수로 빈 문자열을 NULL로 변환한 후 COALESCE로 처리하는 방법을 사용할 수 있습니다. 이렇게 하면 경고 없이 값을 올바르게 처리할 수 있습니다.
NULLIF(bill1, ''): 이 함수는 bill1 값이 빈 문자열인 경우 NULL을 반환합니다. 그렇지 않으면 원래 값을 반환합니다. 이 방법으로 빈 문자열을 NULL로 처리하여 DECIMAL 변환에서 발생하는 경고를 피할 수 있습니다.
COALESCE: 여전히 값이 NULL인 경우 0을 반환하여 계산이 진행되도록 합니다.
이 수정된 쿼리를 실행하면 경고 없이 sum_receivable을 정확하게 계산할 수 있을 것입니다.
위의 코드에서
'COALESCE(CAST(REPLACE(NULLIF(bill1, ''), ',', '') AS DECIMAL(15, 2)), 0) +'
이 문법을 해독할줄 알면 되는 것이었네요^^
COALESCE 는 어떤 의미의 함수인가?
COALESCE 함수는 SQL에서 자주 사용되는 함수로, 전달된 인자들 중에서 NULL이 아닌 첫 번째 값을 반환하는 역할을 합니다. 여러 개의 인자를 순서대로 평가하여, 그 중에서 첫 번째로 NULL이 아닌 값을 찾아 반환합니다. 만약 모든 인자가 NULL이라면 NULL을 반환합니다.
예시:
SELECT COALESCE(NULL, NULL, 'First Non-Null', 'Another Value');
위 SQL 구문은 'First Non-Null'을 반환합니다. 이유는 앞의 두 인자(NULL, NULL)가 NULL이므로, 세 번째 인자 'First Non-Null'이 반환됩니다.
사용 사례:
NULL 대체: 데이터베이스에서 NULL 값을 다른 기본값으로 대체하는 데 사용됩니다.
SELECT COALESCE(column_name, 'Default Value') FROM table_name;
여기서 column_name이 NULL인 경우 'Default Value'가 반환됩니다.
다중 필드 우선순위 처리: 여러 열 중 첫 번째로 NULL이 아닌 값을 선택하고자 할 때 사용됩니다.
SELECT COALESCE(phone_home, phone_mobile, phone_work) AS primary_phone FROM contacts;
이 예시에서, phone_home이 NULL이 아니면 그 값을 반환하고, 그렇지 않으면 phone_mobile, 그다음에 phone_work를 차례로 평가하여 NULL이 아닌 첫 번째 값을 반환합니다.
COALESCE는 한국어로 "코얼레스크" 또는 "코얼리스"라고 읽을 수 있습니다. 정확한 발음은 사람에 따라 약간 다를 수 있지만, 보통 "코얼레스크"라고 많이 읽습니다.
'IT tech Coding > mysql' 카테고리의 다른 글
[mysql] phpMyAdmin 에서 테이블의 구조를 볼 수 있는 방법은? (0) | 2024.08.26 |
---|---|
데이터베이스 조인하기 도전, table의 요소별 조인을 시도하다. (0) | 2024.06.20 |
기존의 id 컬럼에 설정된 PRIMARY KEY와 AUTO_INCREMENT 속성을 num 컬럼으로 변경하려면? (0) | 2024.06.16 |
sql 명령어, 날짜여러개를 비교해서 등록일을 만드는 코드 연구 (0) | 2024.06.15 |
sql 명령에서 특정 문자열의 뒷부분 제거하는 명령어 (0) | 2024.06.11 |
- Total
- Today
- Yesterday
- .htaccess수정
- #프로그램설치
- 프로그래머생활
- 엑셀보호
- 코딩튜토리얼
- #파이썬인스톨러
- #InnoSetup
- 스크립트작성기초
- 테크에능한여성
- 2분후종료오토핫키
- #cx_Freeze
- 엑셀입력보호
- td요소중에 1행과 1열은 제외
- 오토핫키가이드
- 엑셀셀보호
- 뫄프로그래밍
- chatGPT3.5파이썬버전
- sql문장 날짜계산
- 파이썬코드줄바꿈방법
- coalesce는 한국어로 "코얼레스크" 또는 "코얼리스"
- #소프트웨어배포
- 카페24가비아phpinfo수정
- 코딩효율성
- #NSIS
- #독립실행파일
- General error: 2031
- 효율적코딩방법
- #InstallForge
- Bootstrap 5
- #파이썬패키징
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |