백앤드

SQL 한 컬럼에 있는 여러 값을 여러 컬럼으로 분리해서 합치기

머리큰개발자 2023. 2. 28. 22:43

오늘은 또 SQL 때문에 헤맸습니다.

 

제 상황은 이랬습니다.

 

TABLE TEMP_TABLE

NUMBER STATCODE NAME DATE USEYN
3002352 10 해운대 20120101 y
3002352 20 해운대 20120101 y
3002352 30 해운대 20120101 y
3003001 10 인천앞바다 20131111 y
3003001 20 인천앞바다 20131111 null
3003010 10 속초해수욕장 20221001 n
3003010 20 속초해수욕장 20221001 y
3003010 40 속초해수욕장 20221001 y

여기서처럼 number statCode 와 useYn 만 다르고

다른 필드들은 동일한 경우가 많았습니다.

 

위 상황을 number 와 date, name 으로 묶고,

useYn 이 y 일 때는 true, n과 null일 때는 false로 간주하여

statCode 를 컬럼으로 분리하는 것이 문제였습니다.

 

즉 다시 말해서 statCode가 10일 때 useYn이 y 라면 stat1 = true,

statCode 가 20일 때 useYn 이 y 라면 stat2=true 

식으로, 값이 없을 때는 false 로 간주해서 

다음과 같은 테이블을 만드는 것이 목표입니다.

NUMBER NAME DATE STAT1 STAT2 STAT3 STAT4
3002352 해운대 20120101 true true true false
3003001 인천앞바다 20131111 true false false false
3003010 속초해수욕장 20221001 false true false true

 

SQL 호환성을 위해 표준문법만을 사용해서

다음과 같이 작성합니다.

SELECT 
	NUMBER
    ,NAME
    ,DATE
    ,MAX(CASE USEYN = 'y' WHEN STATCODE = '10' THEN TRUE ELSE FALSE END) AS STAT1
    ,MAX(CASE USEYN = 'y' WHEN STATCODE = '20' THEN TRUE ELSE FALSE END) AS STAT2
    ,MAX(CASE USEYN = 'y' WHEN STATCODE = '30' THEN TRUE ELSE FALSE END) AS STAT3
    ,MAX(CASE USEYN = 'y' WHEN STATCODE = '40' THEN TRUE ELSE FALSE END) AS STAT4
FROM TEMP_TABLE
GROUP BY 
	NUMBER
    ,NAME
    ,DATE
ORDER BY NUMBER

MAX를 사용한 이유는

제 원래 테이블에는 같은 날짜에 STATCODE 가 10인 경우가

여러개 있을 수 있기 때문입니다.

 

다른 방법도 많이 찾아봤지만 CASE와 GROUP BY 가 가장 쉬운 것 같습니다.