오라클 SQL 강사 선택 시 조건으로 데이터 가져 오는 게 쉽지 가 않네요 ㅜ도움 부탁 드립니다. 0 4 653

by 아이린 [SQL Query] [2022.04.04 16:11:23]



로우데이터

CLASS_IDX 요일 DAY FR_TIME TO_TIME 강사 GROUP_IDX 반복구분
1 20220401 0900 0950 홍길동 1 매일
2 20220402 0900 0950 홍길동 1 매일
3 20220403 0900 0950 홍길동 1 매일
4 20220401 0900 0950 이영희 2 매주
5 20220408 0900 0950 이영희 2 매주
6 20220415 0900 0950 이영희 2 매주
7 20220402 0900 0950 이철수 3 매주
8 20220409 0900 0950 이철수 3 매주
9 20220416 0900 0950 이철수 3 매주
10 20220403 1000 1050 이만식 4 매주
11 20220410 1000 1050 이만식 4 매주
12 20220417 1000 1050 이만식 4 매주
14 20220401 0900 0950 이희경 5 2주
14 20220415 0900 0950 이희경 5 2주
15 20220429 0900 0950 이희경 5 2주

 

필요데이터               조건 : 4월달 의 요일의 시간데 데이터의
시간 요일 선택한 강사 리스트 조회
조건 요일 DAY FROM_DAY TO_DAY FROM_요일 TO_요일 FR_TIME 강사  
20220401 20220401 20220403 0900 홍길동 WHERE 조건요일 = '월' AND TIME = '0900'
20220401 20220401 20220415 0900 이영희  
20220401 20220401 20220429 0900 이희경  
                 
조건 요일 DAY FROM_DAY TO_DAY FROM_요일 TO_요일 FR_TIME 강사  
20220402 20220401 20220403 0900 홍길동 WHERE 조건요일 = '화' AND TIME = '0900'
20220402 20220402 20220416 0900 이철수  
                 
조건 요일 DAY FROM_DAY TO_DAY FROM_요일 TO_요일 FR_TIME 강사  
20220403 20220403 20220417 1000 이만식 WHERE 조건요일 = '수' AND TIME = '1000'

 

날짜의 예로 2022년 4월달 세로 시간 가로 요일별 캘린더의 여러 강사를 선택해서 가져 올수있게 아래 필요 데이터 처럼 조회를 해야합니다.

필요 데이터의 조건별 값들이 고민 고민을 해보았지만 월, 화, 수 반복구분의 매일 때문에 가져오기가 힘든 상태입니다.

고수님들의 도움이 ㅜ필요합니다. 부탁드려요 감사합니다. EDIT는 엑셀이 잘 안붙여져서 잘 안보이시면 파일 첨부도 했습니다.

by 마농 [2022.04.04 16:43:28]

1. 조건요일 화요일의 필요데이터가 이철수 인데 이영희 로 표기되어 있고
- 오타인 거죠?
2. group_idx 값이 뭔가요?
group_idx 를 이용해 그룹핑하면 쉬울 듯 한데?
group_idx 값이 좀 이상하긴 하네요?
이철수 는 3,4 로 나뉘어 있고? 이만식 도 4를 가지고 있어 이철수 와 중복되고?
group_idx 값이 맞게 표현된 것인지? 아니면 오타인지?


by 아이린 [2022.04.04 16:49:05]

1. 오타였습니다. 수정했습니다.

2. 로우데이터가 class_idx로만 저장되서 따로 강사별 마스터를 등록할때 강사별 날짜 시간으로 해서 group_idx를 만들어서 묶어 준것입니다.

마농님 죄송합니다. 오타였습니다. 데이터 다시 수정했습니다.


by 마농 [2022.04.04 17:00:57]
WITH t AS
(
SELECT 1 class_idx, '월' 요일, '20220401' day, '0900' fr_time, '0950' to_time, '홍길동' 강사, 1 group_idx, '매일' FROM dual
UNION ALL SELECT  2, '화', '20220402', '0900', '0950', '홍길동', 1, '매일' FROM dual
UNION ALL SELECT  3, '수', '20220403', '0900', '0950', '홍길동', 1, '매일' FROM dual
UNION ALL SELECT  4, '월', '20220401', '0900', '0950', '이영희', 2, '매주' FROM dual
UNION ALL SELECT  5, '월', '20220408', '0900', '0950', '이영희', 2, '매주' FROM dual
UNION ALL SELECT  6, '월', '20220415', '0900', '0950', '이영희', 2, '매주' FROM dual
UNION ALL SELECT  7, '화', '20220402', '0900', '0950', '이철수', 3, '매주' FROM dual
UNION ALL SELECT  8, '화', '20220409', '0900', '0950', '이철수', 3, '매주' FROM dual
UNION ALL SELECT  9, '화', '20220416', '0900', '0950', '이철수', 3, '매주' FROM dual
UNION ALL SELECT 10, '수', '20220403', '1000', '1050', '이만식', 4, '매주' FROM dual
UNION ALL SELECT 11, '수', '20220410', '1000', '1050', '이만식', 4, '매주' FROM dual
UNION ALL SELECT 12, '수', '20220417', '1000', '1050', '이만식', 4, '매주' FROM dual
UNION ALL SELECT 14, '월', '20220401', '0900', '0950', '이희경', 5, '2주'  FROM dual
UNION ALL SELECT 14, '월', '20220415', '0900', '0950', '이희경', 5, '2주'  FROM dual
UNION ALL SELECT 15, '월', '20220429', '0900', '0950', '이희경', 5, '2주'  FROM dual
)
SELECT group_idx
     , MIN(DECODE(요일, :v_요일, day)) day
     , MIN(day) from_day
     , MAX(day)   to_day
     , MIN(요일) KEEP(DENSE_RANK FIRST ORDER BY day) from_요일
     , MAX(요일) KEEP(DENSE_RANK LAST  ORDER BY day)   to_요일
     , fr_time
     , 강사
  FROM t
 WHERE fr_time = :v_fr_time
 GROUP BY group_idx, fr_time, 강사
HAVING MIN(DECODE(요일, :v_요일, day)) IS NOT NULL
;

-- group_idx 가 테이블에 없는 항목이라면? (별도로 구한 거라면?)
-- GROUP BY fr_time, 강사 만 하셔도 되겠네요.

 


by 아이린 [2022.04.04 17:05:36]

group_idx는 테이블에 강사수강 등록할때 같이 등록 합니다.

정말 감사 합니다. 마농님 다른 테이블이랑 다시 응용해서 잘쓰겠습니다.^^

즐거운 하루 되세요

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입