✅ ISSUE
현재 보고서 관리 프로그램을 만들고 있는데, 한 건의 보고서에는 총 4명의 담당자가 등록되어야 한다.
보고서 구분은 'REPORTPK'라는 컬럼으로 한다. 이 컬럼은 담당자 테이블에 상속되어 1건의 보고서에 4명의 담당자가 등록될 수 있는 역할을 한다.
4명의 담당자를 등록하기 위해, 담당자 테이블(WORKER_TB)을 따로 만들고 'WORKERKIND'라는 컬럼을 두어, 해당 컬럼으로 하여금 어떤 담당자인지 구분할 수 있게 하였다.
'WORKERKIND'는 총 4개(수신자, 발신자, 담당관, 확인관)이고, 담당자 조회화면을 구현하기 위해 4개 행을 한 행으로 출력해야하는 Issue가 발생하였다.
✔ 일반 조회 시(여러 행)
SELECT * FROM WORKER_TB;
reportpk | workerkind | name | empno |
1 | 수신자 | 홍길동 | 2022_00 |
1 | 발신자 | 김민수 | 2022_01 |
1 | 등록관 | 이철수 | 2022_02 |
1 | 확인관 | 박민지 | 2022_03 |
✅ Solution
1. MAX 함수 활용(한 행으로 출력)
SELECT
REPORTPK,
MAX(CASE WHEN WORKERKIND ='수신자' THEN NAME ELSE NULL END) AS RECEIVER,
MAX(CASE WHEN WORKERKIND ='발신자' THEN NAME ELSE NULL END) AS CALLER,
MAX(CASE WHEN WORKERKIND ='등록관' THEN NAME ELSE NULL END) AS REGISTRAR,
MAX(CASE WHEN WORKERKIND ='확인관' THEN NAME ELSE NULL END) AS CONFIRMER
FROM WORKER_TB
GROUP BY REPORTPK
HAVING REPORTPK = 1;
👀 RESULT
REPORTPK | RECEIVER | CALLER | REGISTRAR | CONFIRMER |
1 | 홍길동 | 김민수 | 이철수 | 박민지 |
✅ 작업 후기
보고서 테이블 설계를 할 때, 사실 담당자 정보를 한 테이블에 다 때려넣으려고 했었다. 근데 개발을 요청한 클라이언트 조직 내 인원들이 부서 및 지사 이동이 잦은 조직이라, 보고서에 등록되는 담당자의 당시 소속에 대한 기록도 남겨야 했었어서 따로 테이블을 두어 이력을 관리하도록 하였다.
항상 습관처럼 만드는 이력관리 기능이지만, 항상 이 부분들은 어떻게 설계해야 할지 고민이 많이 된다. 아직 많이 부족하지만 이렇게 매일 기록하면서 어제보다 나은 설계를 할 수 있길 바래본다...⭐️
'개발 > DB' 카테고리의 다른 글
[DB / Oracle / Table 저장 데이터 용량 확인] (0) | 2023.01.30 |
---|---|
[DB / Tibero / JDBC-5072 / Failure converting NUMBER to or from a native Type] (0) | 2022.07.15 |