Oracle 사례 페이지 조회 및 그룹 정렬

소개 하 다
KM_REVIEW_MAIN: 프로 세 스 메 인 테이블
필드 DOCSUBJECT,DOC_CREATE_TIME (프로 세 스 생 성 시간), DOCCREATOR_ID (즉 SUBMITTER), FDDEPARTMENT_ID (제출 자 부서), DOCSTATUS,
DOC_상태 대응:
-- 10 초고 11 기각 -- 00 폐기 / 제출 자가 자발적으로 취소 - 20 대기 중 -- 30 끝나다
IT_REQUEST_COMPLETION_DETAIL: 프로 세 스 기록 표
모든 프로 세 스 상태 가 변 할 때 이 표 에 한 번 씩 기록 합 니 다. 관련 조건: ITREQUEST_COMPLETION_DETAIL.FD_PROCESS_ID = KM_REVIEW_MAIN.FD_ID
기록 FDPROCESS_ID 에 대응 하 는 FDCREATE_TIME,FD_STATUS,FD_HANDLER_ID 처리 자,
모든 FDPROCESS_ID 가 여러 개 다른 FDCREATE_TIME,FD_STATUS, 가장 늦 은 FDSTATUS, 최신 상태 입 니 다.
정상 절차: 대기 (또는 기각) -- > 수리 되 었 습 니 다 -- > 요청 완료 -- > 신청자 확인 완료,
이미 수리, 대기, 문제 세 가지 상태 로 통 계 를 요구 하 다.
상태 대응:
기다 림
--- 200 수리
--- 300 신청자 확인 완료
질문
--- 600 요청 완료
--- 기타 미 지
IT_REQUEST_PLAN_타임 계획 완료 시간표
필드:
FD_PROCESS_ID, 즉 KMREVIEW_MAIN 의 FDID
FD_CREATE_TIME, 이 메시지 생 성 시간
FD_PLAN_FINISH_TIME, 계획 완료 시간
KM_REVIEW_MAIN_PROPERTY 프로 세 스 유형 표
필드:
FD_DOC_ID, 즉 KMREVIEW_MAIN 의 FDID
FD_PROPERTY_ID, 프로 세 스 유형,
테스트 서버 - 내부 수요: 16c55f20f811ce47da6b70e418192f 67
테스트 서버 - 외부 수요: 16c5165 a9805ef77b491b074e2a8f63b
 
SYS_ORG_ELEMENT 직원 정보 표
필드
FD_ID (유일한 ID), FDNAME (이름), FDNO (작업 번호)
 
SQL 구문

SELECT
	T.*,
	CEIL(TOTAL_NUM / 10 ) TOTAL_PAGE
FROM(
	SELECT 
		S.*,
		COUNT(*) OVER() TOTAL_NUM,
		ROWNUM RNUM
	FROM(
		SELECT 
		M.FD_ID PROCESS_ID,
		M.DOC_SUBJECT SUBJECT,
		SOE.FD_ID SUBMITTER_ID,
		SOE.FD_NAME SUBMITTER_NAME,
		CASE P.FD_PROPERTY_ID
			WHEN '16c55f20f811ce47da6b70e418192f67' THEN '  '
			WHEN '16c5165a9805ef77b491b074e2a8f63b' THEN '  '
			ELSE '  '
		END AS TYPE,
		TO_CHAR(M.DOC_CREATE_TIME,'YYYY-MM-DD') SUBMIT_TIME,
		SOE2.FD_ID DEPARTMENT_ID,
		SOE2.FD_NAME DEPARTMENT_NAME,
		SOE1.FD_ID HANDLER_ID,
		SOE1.FD_NAME HANDLER_NAME,
		TO_CHAR(PT.FD_PLAN_FINISH_TIME,'YYYY-MM-DD') PLAN_FINISH_TIME,
		D.FD_STATUS STATUS_NO,
		CASE D.FD_STATUS 
			WHEN '100' THEN '  '
			WHEN '200' THEN '   '
			WHEN '404' THEN '  '
			WHEN '600' THEN '   '
			WHEN '300' THEN '   '
			ELSE '     '
		END AS STATUS,
		D.FD_CREATE_TIME FD_CREATE_TIME,
		--    ID       ,    、    
		ROW_NUMBER() OVER(
			PARTITION BY D.FD_PROCESS_ID
			ORDER BY D.FD_CREATE_TIME DESC, D.FD_STATUS * 1 DESC
		) AS RN

		FROM KM_REVIEW_MAIN M
		LEFT JOIN SYS_ORG_ELEMENT SOE ON SOE.FD_ID = M.DOC_CREATOR_ID
		LEFT JOIN IT_REQUEST_COMPLETION_DETAIL D ON D.FD_PROCESS_ID = M.FD_ID
		LEFT JOIN IT_REQUEST_PLAN_TIME PT ON PT.FD_PROCESS_ID = M.FD_ID
		LEFT JOIN KM_REVIEW_MAIN_PROPERTY P ON P.FD_DOC_ID = M.FD_ID
		LEFT JOIN SYS_ORG_ELEMENT SOE1 ON SOE1.FD_ID = D.FD_HANDLER_ID
		LEFT JOIN SYS_ORG_ELEMENT SOE2 ON SOE2.FD_ID = SOE1.FD_PARENTID
		WHERE D.FD_STATUS IN ('100','200','404','600','300')
		) S
	WHERE RN = '1'
	) T
WHERE
	RNUM > 0*10 AND RNUM < 1*10
	--      
	AND TO_DATE(SUBMIT_TIME,'YYYY-MM-DD') >= TRUNC(SYSDATE,'IW')
	AND TO_DATE(SUBMIT_TIME,'YYYY-MM-DD') < TRUNC(SYSDATE+7,'IW')
	--      
	AND SUBSTR(SUBMIT_TIME,1,7) = TO_CHAR(SYSDATE,'YYYY-MM')
	--      ~    
	AND TO_DATE(SUBMIT_TIME,'YYYY-MM-DD') >= TO_DATE('2019-08-01','YYYY-MM-DD')
	AND TO_DATE(SUBMIT_TIME,'YYYY-MM-DD') < TO_DATE('2019-08-20','YYYY-MM-DD')

	AND SUBMITTER_ID = '16437e3e2c29277f392d75c41d29574a'
	AND TYPE = '  '
	AND DEPARTMENT_ID = '163e57e1db53402ec4897c04713a400b'
	AND STATUS = '   ';

질문 1: 그룹 정렬
KM_REVIEW_MAIN 의 FDID, 대응 ITREQUEST_COMPLETION_DETAIL 의 여러 기록,
요구 에 따라 FDID 그룹, 각 그룹 FDID 의 여러 개의 기록 을 시간, 번호 에 따라 정렬 합 니 다.
그룹 정렬 방법 1
왼쪽 외부 연결 조회, 다 차원 정렬,
우선 정렬: M. FDID,
재 정렬: D. FD 에 따라CREATE_TIME DESC, D.FD_STATUS * 1 DESC
단순히 D. FD 만 누 르 면CREATE_TIME 정렬, 오류 가 발생 할 수 있 습 니 다. 이 프로 세 스 의 기록 은 다른 프로 세 스 의 기록 과 삽입 되 어 나타 납 니 다.
SELECT      M.FD_ID PROCESS_ID,     D.FD_STATUS STATUS_NO,     D.FD_CREATE_TIME FROM KM_REVIEW_MAIN M     LEFT JOIN IT_REQUEST_COMPLETION_DETAIL D ON D.FD_PROCESS_ID = M.FD_ID ORDER BY M.FD_ID, D.FD_CREATE_TIME DESC, D.FD_STATUS * 1 DESC
패 킷 정렬 방법 2
번 호 를 동시에 정렬 하고 번 호 를 매 길 때 사용한다. PARTITION BY 조별, 사용 ORDER BY 정렬,
SELECT      M.FD_ID PROCESS_ID,     D.FD_STATUS STATUS_NO,     D.FD_CREATE_TIME,     ROW_NUMBER() OVER(         PARTITION BY D.FD_PROCESS_ID         ORDER BY D.FD_CREATE_TIME DESC, D.FD_STATUS * 1 DESC     ) AS RN FROM KM_REVIEW_MAIN M     LEFT JOIN IT_REQUEST_COMPLETION_DETAIL D ON D.FD_PROCESS_ID = M.FD_ID
문제 2: 최신 상태 코드 를 가 져 옵 니 다.
하나의 프로 세 스 는 여러 개의 프로 세 스 기록 에 대응 하고 마지막 프로 세 스 기록 을 최신 상태 로 해 야 합 니 다.
사고: 모든 절차 기록 을 취하 고 시간 에 따라 거꾸로 배열 한 후에 번 호 를 매 긴 다음 에 외부 조회 에서 번 호 를 1 로 기록 합 니 다.
내부 조회
ROW_NUMBER() OVER(             PARTITION BY D.FD_PROCESS_ID             ORDER BY D.FD_CREATE_TIME DESC, D.FD_STATUS * 1 DESC         ) AS RN
외부 조회 선별 번호 1 의
WHERE RN = '1'
질문 3: 페이지 별 조회
먼저 내부 조회 문 에서 각 기록 번 호 를 주 고 총 기록 수량 을 조회 합 니 다.
    SELECT          S.*,         COUNT(*) OVER() TOTAL_NUM,         ROWNUM RNUM
페이지 크기 = 10, 즉 페이지 당 10 개의 기록 을 보 여 준다 고 가정 하면 페이지 수 = TOTAL NUM / 10 을 위로 조정 하고 TOTAL NUM 이 65 이면 총 페이지 수 는 7 이다.
외부 조회 시 총 페이지 수 를 찾 아 보고 번 호 를 보 여줄 페이지 범위 에 한정 합 니 다.
SELECT     T.*,     CEIL(TOTAL_NUM / 10 ) TOTAL_PAGE FROM(     SELECT          S.*,         COUNT(*) OVER() TOTAL_NUM,         ROWNUM RNUM         FROM (***)S )T WHERE     RNUM > 0*10 AND RNUM < 1*10
질문 4: 이번 주 데이터 조회
    AND TO_DATE(SUBMIT_TIME,'YYYY-MM-DD') >= TRUNC(SYSDATE,'IW')     AND TO_DATE(SUBMIT_TIME,'YYYY-MM-DD') < TRUNC(SYSDATE+7,'IW')
TRUNC (SYSDATE, 'IW') 는 이번 주 월요일 을 조회 하 는 00: 00: 00 입 니 다. 일요일 은 이번 주 마지막 날 입 니 다.
TRUNC (SYSDATE + 7, 'IW') 는 다음 주 1 일 을 조회 하 는 00: 00: 00 입 니 다.
질문 5: 이번 달 데이터 조회
AND SUBSTR(SUBMIT_TIME,1,7) = TO_CHAR(SYSDATE,'YYYY-MM')
문제 6: 같은 표 의 다른 조건 의 필드 를 같은 줄 에 놓 습 니 다.
SELECT      A.*,     B1. 필드 1,    B2. 필드 2 FROM      A LEFT JOIN B AS B1 ON B1.ID = A.ID LEFT JOIN B AS B2 ON B2.ID = A.FID
 

좋은 웹페이지 즐겨찾기