안녕하세요.
아래와 같은 경우 어떤식으로 구현하는게 좋을지 의견을 듣고 싶어 글을 남깁니다.
기초자료
- DB: MS-SQL 2008 R2
- 기초 데이터
WITH T AS (
SELECT 'code1' AS code,'0' AS d1,'1' AS d2, '0' as d3, '0' as d4, '4' as d5 FROM DUAL UNION ALL
SELECT 'code2' AS code,'1' AS d1,'3' AS d2, '0' as d3, '2' as d4, '5' as d5 FROM DUAL union all
SELECT 'code3' AS code,'1' AS d1,'2' AS d2, '1' as d3, '2' as d4, '3' as d5 FROM DUAL
)
select
code,d1,d2,d3,d4,d5
from
t;
[결과]
- 소스 자료에 0인값이 있으면 가공자료 같이 이전 값으로 대체하려고 합니다.
MSSQL 은 dual 이 없는데? 따로 만들어 사용하시는 건가요?
MSSQL 에서는 굳이 FROM dual 을 할 필요가 없습니다.
d1, d2 등의 컬럼은 문자 타입 맞나요? 혹시 숫자타입 인데 따옴표 잘못 붙인 건 아닌지?
d1, d2 는 숫자 타입이 맞습니다.
WITH t AS
(
SELECT 'code1' code, 0 d1, 1 d2, 0 d3, 0 d4, 4 d5
UNION ALL SELECT 'code2', 1, 3, 0, 2, 5
UNION ALL SELECT 'code3', 1, 2, 1, 2, 3
)
SELECT code
, d1
, COALESCE(d2, d1) d2
, COALESCE(d3, d2, d1) d3
, COALESCE(d4, d3, d2, d1) d4
, COALESCE(d5, d4, d3, d2, d1) d5
FROM (SELECT code
, d1
, NULLIF(d2, 0) d2
, NULLIF(d3, 0) d3
, NULLIF(d4, 0) d4
, NULLIF(d5, 0) d5
FROM t
) a
;
이렇게 신경 써주셔서 감사합니다.