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 41267 게시물 읽기
No. 41267
시작,종료일자 겹치는 구간에 대해 문의 드려요
작성자
김준수(cs99136)
작성일
2016-10-25 01:09:54
조회수
1,945

안녕하세요~ 두개 코드 종류에 따라 일자별 구간을 모두 구하고 싶은데요 어떻게 해야 할지 감이 안옵니다.

구분 시작일자 종료일자    값
A   20150612   20160608  1.0
A   20160608   20160622  1.3
A   20160622   20160628  1.5
A   20160628   20160701  1.8
A   20160701   20160719  1.6
A   20160719   99991231  1.7

B   20160623   20160628  0.1
B   20160628   20160630  0.2
B   20160630   99991231  0.3

한개 테이블에 구분 값으로 기간별 값이 들어가 있습니다.

A와 B의 시작일자와 종료일자에 서로 겹치는 경우 값을 계산을 하고 싶습니다.

원하는 데이터는 아래 처럼 뷰가 나왔으면 합니다.

구분 시작일자  종료일자    계산값   겹침    A   B
A     20150612  20160608 1.0                   1.0
A     20160608  20160622 1.3                   1.3
A     20160622  20160623 1.5                   1.5
A     20160623  20160628 1.4         V        1.5  0.1
A     20160628  20160630 1.6         V        1.8  0.2
A     20160630  20160701 1.5         V        1.5  0.3
A     20160701  20160719 1.3         V        1.6  0.3
A     20160719  99991231 1.4         V        1.7  0.3

고수님들의 도움이 절실히 필요합니다. ㅠㅠ

WITH GUGAN AS
(
    SELECT 'A' 구분,   '20150612' 시작일자, '20160608' 종료일자, '1.0' 값  FROM DUAL
    UNION ALL
    SELECT 'A' 구분,   '20160608' 시작일자, '20160622' 종료일자, '1.3' 값  FROM DUAL
    UNION ALL
    SELECT 'A' 구분,   '20160622' 시작일자, '20160628' 종료일자, '1.5' 값  FROM DUAL
    UNION ALL
    SELECT 'A' 구분,   '20160628' 시작일자, '20160701' 종료일자, '1.8' 값  FROM DUAL
    UNION ALL
    SELECT 'A' 구분,   '20160701' 시작일자, '20160719' 종료일자, '1.6' 값  FROM DUAL
    UNION ALL
    SELECT 'A' 구분,   '20160719' 시작일자, '99991231' 종료일자, '1.7' 값  FROM DUAL
    UNION ALL   
    SELECT 'B' 구분,   '20160623' 시작일자, '20160628' 종료일자, '0.1' 값  FROM DUAL
    UNION ALL
    SELECT 'B' 구분,   '20160628' 시작일자, '20160630' 종료일자, '0.2' 값  FROM DUAL
    UNION ALL
    SELECT 'B' 구분,   '20160630' 시작일자, '99991231' 종료일자, '0.3' 값  FROM DUAL
   
)
SELECT *
FROM   GUGAN;

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

WITH gugan AS
(
SELECT 'A' gb, '20150612' sdt, '20160608' edt, 1.0 v FROM dual
UNION ALL SELECT 'A', '20160608', '20160622', 1.3 FROM dual
UNION ALL SELECT 'A', '20160622', '20160628', 1.5 FROM dual
UNION ALL SELECT 'A', '20160628', '20160701', 1.8 FROM dual
UNION ALL SELECT 'A', '20160701', '20160719', 1.6 FROM dual
UNION ALL SELECT 'A', '20160719', '99991231', 1.7 FROM dual
UNION ALL SELECT 'B', '20160623', '20160628', 0.1 FROM dual
UNION ALL SELECT 'B', '20160628', '20160630', 0.2 FROM dual
UNION ALL SELECT 'B', '20160630', '99991231', 0.3 FROM dual
)
SELECT sdt
     , edt
     , NVL(a, 0) - NVL(b, 0) calc
     , CASE WHEN a * b > 0 THEN 'V' END overlap
     , a
     , b
  FROM (SELECT dt sdt
             , LEAD(dt)    OVER(ORDER BY dt) edt
             , SUM(SUM(a)) OVER(ORDER BY dt) a
             , SUM(SUM(b)) OVER(ORDER BY dt) b
          FROM (SELECT DECODE(s, 1, sdt, edt) dt
                     , DECODE(gb, 'A', v * s) a
                     , DECODE(gb, 'B', v * s) b
                  FROM gugan
                     , (SELECT DECODE(LEVEL, 1, 1, -1) s
                          FROM dual
                        CONNECT BY LEVEL <= 2
                        )
                 WHERE gb IN ('A', 'B')
                )
         GROUP BY dt
        )
 WHERE a > 0 OR b > 0
;

마농(manon94)님이 2016-10-25 09:54:57에 작성한 댓글입니다.
이 댓글은 2016-10-25 10:04:52에 마지막으로 수정되었습니다.

 답글이 너무 늦어 버렸네요 ㅠㅠ 죄송합니다.

마농님 덕분에 잘 해결 됐습니다.

너무너무 감사합니다.

김준수(cs99136)님이 2016-10-27 14:44:07에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41270기준값에 대한 정렬, 부탁좀 드려봅니다. [6]
기쁨이
2016-10-26
2181
41269일자별 집계 쿼리 문의 [2]
이담원
2016-10-26
2169
41268게시판 파일첨부 소스 질문입니다 ㅜㅜ
문종훈
2016-10-25
1764
41267시작,종료일자 겹치는 구간에 대해 문의 드려요 [2]
김준수
2016-10-25
1945
41266개인 법인 구분 [1]
chen
2016-10-24
1801
41265union all 이용시 존재하지 않는 테이블 제외하고 조회하는 방법 [2]
oraora
2016-10-23
1765
41264마스킹 처리관련 문의드립니다. [5]
딸기쥬스
2016-10-18
1910
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2018 DSN, All rights reserved.
작업시간: 0.071초, 이곳 서비스는
	PostgreSQL v10.4로 자료를 관리합니다