사원별 일자 조회쿼리 궁금합니다. 0 3 175

by 엘시아 [SQL Query] GROUP BY LEVEL 집계함수 사원별 일자 조회 [2019.10.08 17:21:45]


안녕하세요

쿼리를짜다가 궁금한점이있어서 질문드립니다.

사원별 일자를 보고싶은데, 연결된일자는 그룹으로 묶어서 보고싶습니다.

예시)

SELECT 'A' AS "사원", '20190816' AS "일자" FROM DUAL
UNION ALL
SELECT 'A', '20190817' FROM DUAL
UNION ALL
SELECT 'A', '20190818' FROM DUAL
UNION ALL
SELECT 'A', '20190822' FROM DUAL
UNION ALL
SELECT 'A', '20190823' FROM DUAL
UNION ALL
SELECT 'B', '20190901' FROM DUAL
UNION ALL
SELECT 'B', '20190902' FROM DUAL
UNION ALL
SELECT 'B', '20190905' FROM DUAL
사원    일자

A         20190816
A         20190817
A         20190818
A         20190822
A         20190823
B         20190901
B         20190902
B         20190905

 

 

원하는 결과값

사원      시작일      종료일

A        20190816 20190818
A        20190822 20190823
B        20190901 20190902
B        20190905 20190905

 

뭔가 레벨이 들어갈거같고, 사원별이니 GROUP BY가 들어갈거같고.. 로우를 이전일자와 비교해서 하루차이를 체크해야 할 것 같은데 감이 안잡혀서 질문드립니다.

감사합니다.

 

by 생각 [2019.10.08 17:57:27]
WITH T1 AS (
SELECT 'A' AS "사원", '20190816' AS "일자" FROM DUAL
UNION ALL
SELECT 'A', '20190817' FROM DUAL
UNION ALL
SELECT 'A', '20190818' FROM DUAL
UNION ALL
SELECT 'A', '20190822' FROM DUAL
UNION ALL
SELECT 'A', '20190823' FROM DUAL
UNION ALL
SELECT 'B', '20190901' FROM DUAL
UNION ALL
SELECT 'B', '20190902' FROM DUAL
UNION ALL
SELECT 'B', '20190905' FROM DUAL
)
SELECT 사원 
      ,Min(일자) 시작일
      ,Max(일자) 종료일      
  FROM (
SELECT 사원
      ,일자
      ,FLAG
      ,Sum(FLAG) OVER(PARTITION BY 사원 ORDER BY 일자) RST
  FROM (
SELECT CASE WHEN 일자-1 = Lag(일자) OVER (ORDER BY 일자) 
             THEN 0 ELSE 1 END FLAG
       ,사원
       ,일자        
  FROM T1
)
)
GROUP BY 사원,RST
ORDER BY 시작일;

 


by 마농 [2019.10.08 18:19:45]
WITH t AS
(
SELECT 'A' 사원, '20190816' 일자 FROM dual
UNION ALL SELECT 'A', '20190817' FROM dual
UNION ALL SELECT 'A', '20190818' FROM dual
UNION ALL SELECT 'A', '20190822' FROM dual
UNION ALL SELECT 'A', '20190823' FROM dual
UNION ALL SELECT 'B', '20190901' FROM dual
UNION ALL SELECT 'B', '20190902' FROM dual
UNION ALL SELECT 'B', '20190905' FROM dual
)
SELECT 사원
     , MIN(일자) 시작일
     , MAX(일자) 종료일
  FROM (SELECT 사원, 일자 FROM t ORDER BY 사원, 일자)
 GROUP BY 사원, TO_DATE(일자, 'yyyymmdd') - ROWNUM
 ORDER BY 사원, 시작일
;
-- http://gurubee.net/lecture/2194

 


by 엘시아 [2019.10.08 18:24:44]

생각님 , 마농님 답장 감사합니다.

LAG OVER(LEAD), SUM PARTITION(조건별 누계) 배웠습니다.

마농님 가이드는 간단하게 푸는 방식이 매번 경이롭습니다. 감사합니다. ㅎㅎ

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