히스토리 테이블에서 특정 시점 정보를 추출하려고합니다. 테이블에는 작업 코드, 직원 상태, 작업 위치 등과 같은 속성에 매핑되는 fld_nbr이 들어 있습니다. 특정 날짜의 직원 상태를 어떻게 알 수 있습니까? 데이터는DB2 테이블에서 트랜잭션 테이블의 SQL 시점 지정
Employee# fld_nbr beg_date value
1234 19 10/1/16 AA
1234 14 10/1/16 40
1234 14 1/6/17 46
1234 19 9/15/17 LA
가 나는 상태 (fld_nbr 19)과 위치 (fld_nbr 14) 1/1/17에 무엇인지 찾아야 표시 할 수 있습니다. 나는 fld_nbr로 설정 내 결과를 기대 (19) = AA 및 fld_nbr 여기에 편집 내가 함께 결국 무엇을 (14) = 40
: 당신에게 줄 것이다,
WITH MO1 AS
(SELECT AFF.AFFILIATE, COUNT(HIS.EMPLOYEE) AS MO1_HC
FROM
(SELECT HIST.COMPANY, HIST.EMPLOYEE, EMP.ANNIVERS_DATE, EMP.TERM_DATE,
MAX(CASE WHEN HIST.FLD_NBR = 14 THEN A_VALUE END) AS PROCESS_LEVEL,
MAX(CASE WHEN HIST.FLD_NBR = 14 THEN BEG_DATE END) AS PL_DATE,
MAX(CASE WHEN HIST.FLD_NBR = 15 THEN A_VALUE END) AS DEPARTMENT,
MAX(CASE WHEN HIST.FLD_NBR = 15 THEN BEG_DATE END) AS DEPT_DATE,
MAX(CASE WHEN HIST.FLD_NBR = 20 THEN A_VALUE END) AS EMP_STATUS,
MAX(CASE WHEN HIST.FLD_NBR = 20 THEN BEG_DATE END) AS STATUS_DATE,
DAYS(DATE('2017-10-31')) - DAYS(EMP.ANNIVERS_DATE) AS DOS
FROM DATAMGMT.VW_GCHRHRHISTORY HIST
INNER JOIN (SELECT EMPLOYEE, FLD_NBR, MAX(BEG_DATE) AS MostRecent
FROM DATAMGMT.VW_GCHRHRHISTORY
WHERE BEG_DATE < DATE('2017-10-31')
AND COMPANY = 207
AND FLD_NBR IN (14, 15, 20)
GROUP BY EMPLOYEE, FLD_NBR) AS tA ON HIST.EMPLOYEE = tA.EMPLOYEE
AND HIST.FLD_NBR = tA.FLD_NBR
AND HIST.BEG_DATE = tA.MostRecent
INNER JOIN DATAMGMT.VW_GCHREMPLOYEE EMP ON HIST.EMPLOYEE = EMP.EMPLOYEE
WHERE EMP.ANNIVERS_DATE BETWEEN DATE('2017-10-31') - 365 DAYS AND DATE('2017-10-31')
AND SUBSTR(HIST.A_VALUE, 1, 1) NOT IN ('T', 'Z')
GROUP BY HIST.COMPANY, HIST.EMPLOYEE, EMP.ANNIVERS_DATE, EMP.TERM_DATE) AS HIS
INNER JOIN DATAMGMT.VW_GCHRAFFILIATE AFF ON AFF.COMPANY = HIS.COMPANY AND AFF.PROCESS_LEVEL = HIS.PROCESS_LEVEL AND AFF.DEPARTMENT = HIS.DEPARTMENT
WHERE HIS.EMP_STATUS IS NOT NULL
GROUP BY AFF.AFFILIATE),
MO2 AS
(SELECT AFF.AFFILIATE, COUNT(HIS.EMPLOYEE) AS MO2_HC
FROM
(SELECT HIST.COMPANY, HIST.EMPLOYEE, EMP.ANNIVERS_DATE, EMP.TERM_DATE,
MAX(CASE WHEN HIST.FLD_NBR = 14 THEN A_VALUE END) AS PROCESS_LEVEL,
MAX(CASE WHEN HIST.FLD_NBR = 14 THEN BEG_DATE END) AS PL_DATE,
MAX(CASE WHEN HIST.FLD_NBR = 15 THEN A_VALUE END) AS DEPARTMENT,
MAX(CASE WHEN HIST.FLD_NBR = 15 THEN BEG_DATE END) AS DEPT_DATE,
MAX(CASE WHEN HIST.FLD_NBR = 20 THEN A_VALUE END) AS EMP_STATUS,
MAX(CASE WHEN HIST.FLD_NBR = 20 THEN BEG_DATE END) AS STATUS_DATE,
DAYS(DATE('2017-10-31') - 1 MONTH) - DAYS(EMP.ANNIVERS_DATE) AS DOS
FROM DATAMGMT.VW_GCHRHRHISTORY HIST
INNER JOIN (SELECT EMPLOYEE, FLD_NBR, MAX(BEG_DATE) AS MostRecent
FROM DATAMGMT.VW_GCHRHRHISTORY
WHERE BEG_DATE < DATE('2017-10-31') - 1 MONTH
AND COMPANY = 207
AND FLD_NBR IN (14, 15, 20)
GROUP BY EMPLOYEE, FLD_NBR) AS tA ON HIST.EMPLOYEE = tA.EMPLOYEE
AND HIST.FLD_NBR = tA.FLD_NBR
AND HIST.BEG_DATE = tA.MostRecent
INNER JOIN DATAMGMT.VW_GCHREMPLOYEE EMP ON HIST.EMPLOYEE = EMP.EMPLOYEE
WHERE EMP.ANNIVERS_DATE BETWEEN DATE('2017-10-31') - 1 MONTH - 365 DAYS AND DATE('2017-10-31') - 1 MONTH
AND SUBSTR(HIST.A_VALUE, 1, 1) NOT IN ('T', 'Z')
GROUP BY HIST.COMPANY, HIST.EMPLOYEE, EMP.ANNIVERS_DATE, EMP.TERM_DATE) AS HIS
INNER JOIN DATAMGMT.VW_GCHRAFFILIATE AFF ON AFF.COMPANY = HIS.COMPANY AND AFF.PROCESS_LEVEL = HIS.PROCESS_LEVEL AND AFF.DEPARTMENT = HIS.DEPARTMENT
WHERE HIS.EMP_STATUS IS NOT NULL
GROUP BY AFF.AFFILIATE)
SELECT MO1.AFFILIATE, MO1.MO1_HC, MO2.MO2_HC
FROM MO1
INNER JOIN MO2 ON MO2.AFFILIATE = MO1.AFFILIATE
날짜 범위와 우수한 블로그 재미가 될 수 있도록 TSQL을 사용하여 작성되었다 - 또한 Used_By_Already의 답에 맞는 - 여기 http://www.idug.org/p/bl/et/blogaid=672 – MichaelTiefenbacher
모두에게 도움을 주셔서 감사합니다! 나는 실제로 모든 샘플을 사용하고 있으며 매우 감사하고 있습니다! 내가 끝낸 것을 보여주기 위해 원래 게시물을 편집했습니다. –