새해 복 많이 받으시구요. 올한해 건강들 하세요.
다름 아니라 화면을 하나 만들어야하는데 쿼리가 좀 애매해서 도움 부탁드리려고 합니다.
아래는 제가 정리를 좀 해본 내용인데요. 읽어봐주시기 바랍니다.
기준 | 구분 | 항목1 | 항목2 | 항목3 | |
10 | 전 | 7 | 8 | 6 | <- DB 저장값 |
10 | 후 | 8 | 8 | 7 | <- DB 저장값 |
30 | 전 | ||||
30 | 후 | ||||
50 | 전 | 49 | 50 | 51 | <- DB 저장값 |
50 | 후 | ||||
70 | 전 | ||||
70 | 후 | ||||
100 | 전 | ||||
100 | 후 |
전값은 : 사번, 이름을 키로 등록일이 최초인 날짜의 데이터를 고정으로 조회해옵니다.
후값은 : 사번, 이름과 또 다른 키로 조회해옵니다.
1. 저장은 후값만 저장이 될것이며 항목에 값이 있는 것만 기준값과 키값(사번, 이름, 문서번호 등)들과 함께 저장이됩니다.
2. 근데 문제는 조회해올때 위 화면과 같이 저장이 저장이 안된 기준값 10~100까지 전후 다 가져와서 화면에 보여줘야합니다.
값이 있으면 값을 보여주면 되고 없으면 없는대로 빈칸으로 보여줘야합니다.
3. 화면이 grid라서 목록형식으로 불러와야합니다.
나름 정리한다고 했는데...이해가 되실지 모르겠습니다
궁금한 점 질문해주시고 도움 부탁드리겠습니다(__)
아직 테이블 생성 전이라 데이터는 없구요..
위 예제 화면으로 데이터가 들어가 있다는 걸 가정한다면
emp_num | emp_nam | doc_no | cal | op1 | op2 | op3 | create_dt | update_dt |
111111 | 아무개 | 14000 | 10 | 7 | 8 | 6 | 2017-12-31 | sysdate |
222222 | 김철수 | 14001 | 10 | 8 | 8 | 7 | 2018-01-02 | sysdate |
333333 | 이영희 | 14000 | 50 | 49 | 50 | 51 | 2017-12-31 | sysdate |
이 정도 데이터가 되겠네요...
음..화면에서 파라미터 넘길 때 현재 문서번호만 넘기기 때문에 후값은 사번, 이름, 문서번호로 조회하고
전값 조회할때는 문서번호로 하지 않고 사번, 이름, 등록일로 최초 전값만 조회해야합니다.
아 그리고 날짜는 Date 형식이고 나머지는 varchar2로 만들 예정입니다.
PK 는 (doc_no, cal) 로 하시고
별도 인덱스 (emp_num, create_dt) 가 필요합니다.
WITH data_t(emp_num, doc_no, cal, op1, op2, op3, create_dt) AS ( SELECT 111111, 13000, 10, 1, 2, 3, '2017-11-31' FROM dual UNION ALL SELECT 111111, 14000, 10, 7, 8, 6, '2017-12-31' FROM dual UNION ALL SELECT 222222, 14001, 10, 8, 8, 7, '2018-01-02' FROM dual UNION ALL SELECT 111111, 14000, 50, 49, 50, 51, '2017-12-31' FROM dual ) , code_t AS ( SELECT 10 cal FROM dual UNION ALL SELECT 30 FROM dual UNION ALL SELECT 50 FROM dual UNION ALL SELECT 70 FROM dual UNION ALL SELECT 100 FROM dual ) SELECT a.cal , b.gb , b.op1, b.op2, b.op3 FROM code_t a LEFT OUTER JOIN (SELECT * FROM (SELECT cal , ROW_NUMBER() OVER(PARTITION BY cal ORDER BY create_dt) gb , op1, op2, op3 FROM data_t WHERE emp_num = 111111 ) WHERE gb = 1 UNION ALL SELECT cal , 2 gb , op1, op2, op3 FROM data_t WHERE doc_no = 14000 ) b PARTITION BY (b.gb) ON a.cal = b.cal ORDER BY a.cal, b.gb ;
WITH data_t(emp_num, doc_no, cal, op1, op2, op3, create_dt) AS ( SELECT 111111, 13000, 10, 1, 2, 3, '2017-11-31' FROM dual UNION ALL SELECT 111111, 14000, 10, 7, 8, 6, '2017-12-31' FROM dual UNION ALL SELECT 222222, 14001, 10, 8, 8, 7, '2018-01-02' FROM dual UNION ALL SELECT 111111, 14000, 50, 49, 50, 51, '2017-12-31' FROM dual UNION ALL SELECT 111111, 13000, 30, 3, 4, 5, '2017-11-31' FROM dual ) , code_t AS ( SELECT 10 cal FROM dual UNION ALL SELECT 30 FROM dual UNION ALL SELECT 50 FROM dual UNION ALL SELECT 70 FROM dual UNION ALL SELECT 100 FROM dual ) SELECT a.cal , b.gb , b.op1, b.op2, b.op3 FROM code_t a LEFT OUTER JOIN (SELECT * FROM (SELECT cal , RANK() OVER(ORDER BY create_dt) gb -- 수정 , op1, op2, op3 FROM data_t WHERE emp_num = 111111 ) WHERE gb = 1 UNION ALL SELECT cal , 2 gb , op1, op2, op3 FROM data_t WHERE doc_no = 14000 ) b PARTITION BY (b.gb) ON a.cal = b.cal ORDER BY a.cal, b.gb ;