오늘은 또 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 가 가장 쉬운 것 같습니다.