기간을 검색조건으로 주어 두날짜사이의 일자및 내역의 통계를 구하고 싶습니다. 1 6 3,432

by 손님 기간 [2009.08.04 09:44:27]


안녕하세요. 고수님들의 친절한 답변부탁드립니다.      
               
테이블명 :휴가테이블            
이름 시작일 종료일 휴가내역        
홍길동 20090701 20090703 휴가        
홍길동 20090711 20090711 월차        
금강산 20090701 20090707 하계        
금강산 20090709 20090712 훈련        
한라산 20090702 20090702 월차        
한라산 20090705 20090710 년차        
백두산 20090703 20090730 휴직        
               
1.위와같은 테이블이 있고  조회조건을 기간 (시작일 20090702 종료일 20090711)으로 하여  
다음과 같은 결과1과 결과2를 보고 싶습니다.        
               
결과1              
이름 일자 휴가내역          
홍길동 20090702 휴가          
홍길동 20090703 휴가          
홍길동 20090711 월차          
금강산 20090702 하계          
금강산 20090703 하계          
금강산 20090704 하계          
금강산 20090705 하계          
금강산 20090706 하계          
금강산 20090707 하계          
금강산 20090709 훈련          
금강산 20090710 훈련          
금강산 20090711 훈련          
한라산 20090702 월차          
한라산 20090705 년차          
한라산 20090706 년차          
한라산 20090707 년차          
한라산 20090708 년차          
한라산 20090709 년차          
한라산 20090710 년차          
백두산 20090703 휴직          
백두산 20090704 휴직          
백두산 20090705 휴직          
백두산 20090706 휴직          
백두산 20090707 휴직          
백두산 20090708 휴직          
백두산 20090709 휴직          
백두산 20090710 휴직          
백두산 20090711 휴직          
               
결과2              
이름 휴가 월차 하계 훈련 년차 휴직  
홍길동 2일 1일          
금강산     6일 3일      
한라산   1일     6일    
백두산           9일  
               
즉 20090702부터 20090711사이에 해당되는 일짜를 각개인별 휴가내역별로 보고 싶습니다.
by 러드 [2009.08.04 11:02:51]
WITH A AS
(
SELECT '홍길동'AS NAME,'20090701' AS SD,'20090703' AS ED ,'휴가' AS GB FROM DUAL UNION ALL
SELECT '홍길동'AS NAME,'20090711' AS SD,'20090711' AS ED ,'월차' AS GB FROM DUAL UNION ALL
SELECT '금강산'AS NAME,'20090701' AS SD,'20090707' AS ED ,'하계' AS GB FROM DUAL UNION ALL
SELECT '금강산'AS NAME,'20090709' AS SD,'20090712' AS ED ,'훈련' AS GB FROM DUAL UNION ALL
SELECT '한라산'AS NAME,'20090702' AS SD,'20090702' AS ED ,'월차' AS GB FROM DUAL UNION ALL
SELECT '한라산'AS NAME,'20090705' AS SD,'20090710' AS ED ,'년차' AS GB FROM DUAL UNION ALL
SELECT '백두산'AS NAME,'20090703' AS SD,'20090730' AS ED ,'휴직' AS GB FROM DUAL
)
SELECT NAME
, COUNT(CASE WHEN GB = '휴가' THEN 1 END) C01
, COUNT(CASE WHEN GB = '월차' THEN 1 END) C02
, COUNT(CASE WHEN GB = '하계' THEN 1 END) C03
, COUNT(CASE WHEN GB = '훈련' THEN 1 END) C04
, COUNT(CASE WHEN GB = '년차' THEN 1 END) C05
, COUNT(CASE WHEN GB = '휴직' THEN 1 END) C06
FROM ( SELECT A.*
, ROWNUM AS RN
FROM A
) A
, ( SELECT '2009' || LPAD(MM,2,0) || LPAD(DD,2,0) AS DAY#
FROM ( SELECT LEVEL AS MM FROM DUAL CONNECT BY LEVEL <= 12 )
, ( SELECT LEVEL AS DD FROM DUAL CONNECT BY LEVEL <= 31 )
WHERE '2009' || LPAD(MM,2,0) || LPAD(DD,2,0) BETWEEN '20090702' AND '20090711'
) B
WHERE B.DAY# BETWEEN SD AND ED
GROUP BY NAME
ORDER BY MAX(RN)

by 구경서 [2009.08.04 11:03:02]
결과 1

with test as
(
select '홍길동' name , '20090701' sdate ,'20090703' edate , '휴가' ds from dual union all
select '홍길동' name , '20090711' sdate ,'20090711' edate , '월차' ds from dual union all
select '금강산' name , '20090701' sdate ,'20090707' edate , '하계' ds from dual union all
select '금강산' name , '20090709' sdate ,'20090712' edate , '훈련' ds from dual union all
select '한라산' name , '20090702' sdate ,'20090702' edate , '월차' ds from dual union all
select '한라산' name , '20090705' sdate ,'20090710' edate , '년차' ds from dual union all
select '백두산' name , '20090703' sdate ,'20090730' edate , '휴직' ds from dual
)


select T1.cd ,T2.name ,T2.ds FROM
(
select to_char(to_date('20090702','YYYY-MM-DD') - 1 + level,'YYYYMMDD') cd from dual connect by level <=
(to_date('20090711','YYYY-MM-DD') -to_date('20090702','YYYY-MM-DD')) +1
)T1 , test T2
WHERE T1.cd BETWEEN t2.sdate AND T2.EDATE
order by 2 desc ,1

by 구경서 [2009.08.04 11:27:21]
결과 2

with test as
(
select '홍길동' name , '20090701' sdate ,'20090703' edate , '휴가' ds from dual union all
select '홍길동' name , '20090711' sdate ,'20090711' edate , '월차' ds from dual union all
select '금강산' name , '20090701' sdate ,'20090707' edate , '하계' ds from dual union all
select '금강산' name , '20090709' sdate ,'20090712' edate , '훈련' ds from dual union all
select '한라산' name , '20090702' sdate ,'20090702' edate , '월차' ds from dual union all
select '한라산' name , '20090705' sdate ,'20090710' edate , '년차' ds from dual union all
select '백두산' name , '20090703' sdate ,'20090730' edate , '휴직' ds from dual
)

SELECT
NAME,
SUM(DECODE(DS,'휴가',DD)) "휴가",
SUM(DECODE(DS,'월차',DD)) "월차",
SUM(DECODE(DS,'하계',DD)) "하계",
SUM(DECODE(DS,'훈련',DD)) "훈련",
SUM(DECODE(DS,'년차',DD)) "년차",
SUM(DECODE(DS,'휴직',DD)) "휴직"
FROM
(
select T1.NAME ,
CASE WHEN T1.EDATE >= T2.ED THEN TO_DATE(T2.ED,'YYYY-MM-DD') ELSE TO_DATE(T1.EDATE,'YYYY-MM-DD') END -
CASE WHEN T1.SDATE <= T2.SD THEN TO_DATE(T2.SD,'YYYY-MM-DD') ELSE TO_DATE(T1.SDATE,'YYYY-MM-DD') END +1 DD,
DS

FROM TEST T1,
(SELECT '20090702' SD , '20090711' ED FROM DUAL) T2
WHERE T1.SDATE <= t2.ED
AND T1.EDATE >= T2.SD
)
GROUP BY NAME

by 마농 [2009.08.04 12:30:15]
구경서님의 댓글 살짝 수정해봤습니다.
TO_DATE(LEAST(t1.edate,t2.ed),'yyyymmdd') - TO_DATE(GREATEST(t1.sdate,t2.sd),'yyyymmdd') + 1 dd

by 구경서 [2009.08.04 13:32:14]
ㄴ 압 제가 밥먹고 올릴라고 했는대 !! ㅋㅋ 좋네요!!

by 질문자 [2009.08.04 14:36:58]
빠르고 정확한 답변달아주신

러드님,구경서님,마농님

정말로 감사드립니다.

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