-
Replace, Translate 이용 / Order by 임의지정SQL/MSSQL 2023. 7. 5. 10:08
dma105 테이블에서 spec 컬럼은 HD300*2400 등 숫자앞에 문자와 숫자가 결합된 형태의 데이터이고
거래처에서 spec_bc 컬럼의 데이터중에서 'ACC'를 제외한 나머지는 문자를 제거해서 보여주길 원했다.
그림1 - spec_bc 컬럼 젤 밑쪽 'ACC' 참고
서브쿼리(Inline View) 절에서 spec컬럼 값인 HD300*2400 와 같은
문자,숫자,특수문자로 결합된 데이터를 문자만 남겨두고 숫자와 특수문자는 제거하기 위해서 translate를 이용하여 빈문자열로 변환뒤 trim으로 공백제거를 해서 HD라는 문자만을 남기게 했고 그 컴럼값을 spec_text라고 명명했다.
select 문에서 case when을 통해 spec_bc에서 'ACC'가 포함되지 않을 경우 spec 값에서 spec_text 값을 찾아 공백으로 변환하고
포함되어있으면 그대로 spec을 사용하게 했다.
정렬은 order by를 통해서 했지만 order by를 사용하면 문자 순서대로 정렬됬기 때문에 업체가 원한 순서가 아니여서
case when을 통하여 원하는 값들을 1,2,3 등 숫자로 변환하여 order by가 숫자순으로 정렬되게 했다. (가끔씩 사용하는듯....)
select a.spec_bc ,spec = (case when a.spec_bc not in ('ACC') then replace(a.spec,a.spec_text,'') else a.spec end), spec_key = a.spec_bc + '/' + (case when a.spec_bc not in ('ACC') then replace(a.spec,a.spec_text,'') else a.spec end) from( select a.spec_bc, a.spec, trim(translate(a.spec,'0123456789*',' ')) as spec_text from dma105 a where 1=1 and a.rental_yn = '1' ) a group by a.spec_bc, (case when a.spec_bc not in ('ACC') then replace(a.spec,a.spec_text,'') else a.spec end) order by --정렬순서 상품, 화섬, 원면순으로 (case when a.spec_bc='W,WE' then 1 --화섬 when a.spec_bc='SW,SWE' then 2 --원면 when a.spec_bc='DECK' then 3 --상품 when a.spec_bc= 'ACC' then 4 else 5 end)
그림1 'SQL > MSSQL' 카테고리의 다른 글
MSSQL 재귀쿼리 (with) 사용 (0) 2023.07.05