오라클 쿼리짜다가 막혀서 급 질문드립니다 ㅠ!! 0 7 1,521

by 빡친다 [Oracle 기초] [2017.05.25 11:01:28]


안녕하세요 인사쪽맡고있는 전산팀입니다. 쿼리짜다가 급막혀서 글을남깁니다.

select 날짜, 부서
from 부서이력테이블   이렇게 딱 치면요

3월 인사팀
4월 인사팀
5월 인사팀
6월 회계팀
7월 회계팀
8월 총무팀
9월 인사팀

이렇게 조회된다고 가정합니다.

그런데 제가원하는 데이터는 그사람의 부서 이력을 뽑아내야해서요

3월 인사팀
6월 회계팀
8월 총무팀
9월 인사팀

이렇게 결과값이 나와야 해서요 방법이 있을까요ㅜ 은근히 어렵네요 진짜..

다시 설명드리면 해당직원이  1~6월 인사팀, 7~9월 총무팀,  10월~12월 인사팀 있었으면

12월 12건 다 보여주는게 아니라 1월인사팀, 7월 총무팀, 10월 인사팀   딱 3건만 보여주는거죠

답변 꼭 부탁드립니다!!! ㅠ

by 랑에1 [2017.05.25 11:36:33]
WITH 부서이력테이블(날짜, 부서) AS(
SELECT '3월', '인사팀' FROM dual UNION ALL
SELECT '4월', '인사팀' FROM dual UNION ALL 
SELECT '5월', '인사팀' FROM dual UNION ALL 
SELECT '6월', '회계팀' FROM dual UNION ALL 
SELECT '7월', '회계팀' FROM dual UNION ALL 
SELECT '8월', '총무팀' FROM dual UNION ALL 
SELECT '9월', '인사팀' FROM dual
)

SELECT 날짜, 부서
FROM 
(
  SELECT 날짜, 부서, ROW_NUMBER() OVER(PARTITION BY gr ORDER BY 날짜) rn
  FROM 
  (
    SELECT 날짜, 부서, SUM(lg) OVER(ORDER BY 날짜) gr
    FROM 
    (
      SELECT 날짜, 부서, CASE WHEN 부서 = LAG(부서, 1) OVER(ORDER BY 날짜) THEN 0 ELSE 1 END lg
      FROM 부서이력테이블
    )
  )
)
WHERE rn = 1
ORDER BY 날짜

쓸떼없이 긴것 같네요;

 


by 신이만든짝퉁 [2017.05.25 12:11:35]
WITH dept_hist(month, dept) AS(
 SELECT '3월', '인사팀' FROM dual UNION ALL
 SELECT '4월', '인사팀' FROM dual UNION ALL
 SELECT '5월', '인사팀' FROM dual UNION ALL
 SELECT '6월', '회계팀' FROM dual UNION ALL
 SELECT '7월', '회계팀' FROM dual UNION ALL
 SELECT '8월', '총무팀' FROM dual UNION ALL
 SELECT '9월', '인사팀' FROM dual
 )
SELECT   MONTH, DEPT
    FROM (SELECT MONTH, DEPT, CASE
                     WHEN DEPT = LAG(DEPT, 1) OVER(ORDER BY MONTH) THEN 0
                     ELSE 1
                 END LG
            FROM DEPT_HIST)
   WHERE LG = 1
ORDER BY MONTH ASC;       

이렇게 하면 좀 더 짧아지겠네요.


by 랑에1 [2017.05.25 12:47:13]

그러게요 제가 왜 저래놨을까요 ㅋㅋ


by 빡친다 [2017.05.25 11:49:41]

너무 감사합니다 랑에1님 죄송한데

서브쿼리부분 이해가안되는데 설명좀 해주실수있나요?

님은 천재십니다..


by 랑에1 [2017.05.25 12:51:24]
SELECT 날짜, 부서
FROM
(
  SELECT 날짜, 부서, lg
  FROM
  (
    SELECT 날짜, 부서, CASE WHEN 부서 = LAG(부서, 1) OVER(ORDER BY 날짜) THEN 0 ELSE 1 END lg -- 오름차순으로 정렬된 날짜 기준으로 부서가 변경된 월을 체크
    FROM 부서이력테이블
  )
)
WHERE lg = 1 -- 변경된 월만 골라서 조회
ORDER BY 날짜            

천재는 다른분이 계시고요 ㅋㅋ
주석 참고하시면 됩니다 ㅎㅎ

 


by 신이만든짝퉁 [2017.05.25 12:12:46]
WITH T AS (
SELECT 3 MONTH, '인사팀' DEPT FROM DUAL UNION ALL
SELECT 4 MONTH, '인사팀' DEPT FROM DUAL UNION ALL
SELECT 5 MONTH, '인사팀' DEPT FROM DUAL UNION ALL
SELECT 6 MONTH, '회계팀' DEPT FROM DUAL UNION ALL
SELECT 7 MONTH, '회계팀' DEPT FROM DUAL UNION ALL
SELECT 8 MONTH, '총무팀' DEPT FROM DUAL UNION ALL
SELECT 9 MONTH, '인사팀' DEPT FROM DUAL
)
SELECT   MIN(MONTH) MONTH, DEPT
    FROM (SELECT   MONTH
                 , DEPT
                 , MONTH - LAG(MONTH, 1, MONTH - 1) OVER(PARTITION BY DEPT ORDER BY DEPT ASC, MONTH ASC) LAG_MONTH
              FROM T
          ORDER BY MONTH ASC)
GROUP BY LAG_MONTH, DEPT
ORDER BY MONTH ASC; 

전 이렇게 짜보았습니다.


by 빡친다 [2017.05.25 17:43:28]

정말 감사합니다. 이 답변으로 마지막관문에 오를수있었습니다. 마지막 질문좀 봐주세요..

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