database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 39040 게시물 읽기
No. 39040
중복기간 일수 조회 질문입니다.
작성자
deicide(pat8002)
작성일
2011-11-03 18:33
조회수
5,352

안녕하세요.

궁굼증이 있어서 문의 드립니다.

기준일이 20110108 ~ 20110115이구요.

아래와 같은 테이블이 있습니다.

1 테이블

ID          STARTDT         ENDDT

----------------------------------------------

A           20110101      20110115

B           20110112      20110118

C          20110119       20110125

D          20110123       20110131

조회 하고 싶은 내용은 기준일과 중복되는 데이타의 중복일수를 구하는 문제인데요.

아래와 같이 표현하고 싶습니다.

결과 테이블

ID          STARTDT         ENDDT           CNT

------------------------------------------------------------------

A           20110101      20110115              8

B           20110112      20110118             4

C          20110119       20110125             0

D          20110123       20110131             0

 

고수님들의 조언 부탁드리겠습니다.

이 글에 대한 댓글이 총 3건 있습니다.

 

 

WITH TB AS (

SELECT 'A' AS ID ,'20110101' AS STDT,'20110115' AS ENDT FROM DUAL UNION ALL

SELECT 'B' AS ID ,'20110112' AS STDT,'20110118' AS ENDT FROM DUAL UNION ALL

SELECT 'C' AS ID ,'20110119' AS STDT,'20110125' AS ENDT FROM DUAL UNION ALL

SELECT 'D' ,'20110123','20110131' FROM DUAL

)

SELECT id,stdt,endt,nvl((ENDDT - STARTDT)+1,0) as CNT,std,btd

FROM (

select a.id,a.stdt,a.endt,b.stdt as std , b.endt as btd, 

(CASE 

WHEN a.stdt >= b.stdt THEN a.stdt 

WHEN a.stdt < b.stdt THEN b.stdt

END

) as STARTDT, 

(CASE

WHEN a.endt >= b.endt THEN b.endt

WHEN a.endt < b.endt THEN a.endt

END

) as ENDDT

from tb a left outer join

(select 'AA' ID, '20110108' as stdt, '20110115' as endt from dual) b

on ((a.stdt between b.stdt and b.endt)

 or   (a.endt between b.stdt and b.endt))

)

 

 

cReAm(catz)님이 2011-11-04 09:54에 작성한 댓글입니다.
WITH temp AS
        (SELECT 'A' AS id, '20110101' startdt, '20110115' enddt FROM DUAL
         UNION ALL
         SELECT 'B' AS id, '20110112' startdt, '20110118' enddt FROM DUAL
         UNION ALL
         SELECT 'C' AS id, '20110119' startdt, '20110125' enddt FROM DUAL
         UNION ALL
         SELECT 'D' AS id, '20110123' startdt, '20110131' enddt FROM DUAL
         UNION ALL
         SELECT 'E' AS id, '20110114' startdt, '20110115' enddt FROM DUAL)
SELECT id, startdt, enddt, DECODE (SIGN (cnt), -1, 0, cnt + 1) cnt
  FROM (SELECT id
              ,startdt
              ,enddt
              ,LEAST (TO_DATE ('20110115', 'YYYYMMDD'), TO_DATE (enddt, 'YYYYMMDD')) - 
               GREATEST (TO_DATE('20110108','YYYYMMDD'),TO_DATE (startdt, 'YYYYMMDD')) cnt
          FROM temp)
 

 

아무거나님이 2011-11-04 10:08에 작성한 댓글입니다.
이 댓글은 2011-11-04 10:10에 마지막으로 수정되었습니다. Edit

위에 두분 정말 감사드립니다.

꽤 어렵게 생각하고 있었는데.. 의외로 간단하게 결과가 도출되었군요..!!

다시한번 감사드립니다.

추가적으로 혹시 요일체크도 가능할런지요...

deicide(pat8002)님이 2011-11-07 08:55에 작성한 댓글입니다.
이 댓글은 2011-11-07 09:19에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
39043최근 6개월 동안 계속 실적이 있는 껀만 집계 [1]
taiji
2011-11-04
4961
3904211g에서 9i로 import하려고 9i에서 11g접속 후 exorpt시 안됨 [4]
조국
2011-11-04
8716
39041중복된 데이터중에 각 한건씩만 가져오고 싶습니다. [2]
allan
2011-11-03
4931
39040중복기간 일수 조회 질문입니다. [3]
deicide
2011-11-03
5352
39038터미널 동시 접속 시 쿼리가 느려지는 현상 [2]
장정
2011-11-02
4322
39037데이타가 손실되요 [1]
디비초보
2011-11-02
3557
39036GROUP BY 관련해서..2 [1]
카라
2011-11-02
4573
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다