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 40398 게시물 읽기
No. 40398
이런 쿼리 가능할까요?
작성자
이태우
작성일
2014-03-10 11:39
조회수
6,949
적용시작일 적용종료일 금액
20130101 20131231 1000
20130520 20140228 2000
20130412 20140131 500
     

 

 

WITH T AS(

SELECT '20130101' FRDT,  '20131231' TODT, 1000 AMT FROM DUAL UNION ALL

SELECT '20130520',       '20140228',    2000     FROM DUAL UNION ALL

SELECT '20130412',     '20140131',       500     FROM DUAL

)

위와같은 DATA를 아래와 같은 형태로 조회가 가능할까요?

 

20130101     20130411    1000

20130412     20130519    1500

20130520     20131231    3500

20140101     20140131    2500

20140201     20140228    2000

 

도움 부탁드립니다.

 

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

WITH t AS
(
SELECT '20130101' frdt, '20131231' todt, 1000 amt FROM dual
UNION ALL SELECT '20130520', '20140228', 2000 FROM dual
UNION ALL SELECT '20130412', '20140131',  500 FROM dual
)
SELECT frdt, todt, amt
  FROM (SELECT TO_CHAR(dt, 'yyyymmdd') frdt
             , TO_CHAR(LEAD(dt) OVER(ORDER BY dt) - 1, 'yyyymmdd') todt
             , SUM(SUM(amt)) OVER(ORDER BY dt) amt
          FROM (SELECT DECODE(lv, 1, TO_DATE(frdt, 'yyyymmdd')
                                , 2, TO_DATE(todt, 'yyyymmdd') + 1
                                ) dt
                     , DECODE(lv, 1, amt, -amt) amt
                  FROM t
                     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 2)
                )
         GROUP BY dt
        )
 WHERE amt > 0
;

마농(manon94)님이 2014-03-10 15:30에 작성한 댓글입니다.


WITH T AS(
SELECT '20130101' FRDT,  '20131231' TODT, 1000 AMT FROM DUAL UNION ALL
SELECT '20130520',       '20140228',      2000     FROM DUAL UNION ALL
SELECT '20130412',       '20140131',       500     FROM DUAL
)
SELECT MIN(X.TARGET_DATE) AS START_DATE
     , MAX(X.TARGET_DATE) AS END_DATE
     , X.AMT
  FROM (SELECT T1.TARGET_DATE
             , SUM(T2.AMT) AS AMT
          FROM (SELECT FROMDATE + (LEVEL -1) AS TARGET_DATE
                  FROM (SELECT MIN(TO_DATE(FRDT, 'YYYYMMDD')) AS FROMDATE
                             , MAX(TO_DATE(TODT, 'YYYYMMDD')) AS TODATE
                          FROM T
                        ) X
                CONNECT BY LEVEL <= X.TODATE - X.FROMDATE
               ) T1
               LEFT OUTER JOIN T T2
               ON  T1.TARGET_DATE BETWEEN TO_DATE(FRDT,'YYYYMMDD')
                                      AND TO_DATE(TODT,'YYYYMMDD')
         GROUP BY T1.TARGET_DATE
       ) X
 GROUP BY X.AMT
 ORDER BY MIN(X.TARGET_DATE)

팡(pangs)님이 2014-03-10 16:02에 작성한 댓글입니다.
이 댓글은 2014-03-10 16:04에 마지막으로 수정되었습니다.

마농님과 팡님의 도움에

진심으로 감사드립니다. ^^

이태우님이 2014-03-10 16:13에 작성한 댓글입니다. Edit

팡님의 쿼리엔 오류가...

예시 결과 5개행의 금액이 모두 달라서. 우연하게 결과만 맞게 나온 것이죠.

원본 자료에 20140210, 20140220, 500 을 추가해 보면...

마농(manon94)님이 2014-03-10 16:25에 작성한 댓글입니다.

그러네요;;

단순히 날짜별로 데이터 생성해서 AMT로 GROUP BY 쳐버렸는데

데이터가 추가되면 잘못 나오겠네요 ㅠㅠ

팡(pangs)님이 2014-03-10 17:49에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40405권한주는 방법을 알려주세요~ [1]
궁금이
2014-03-13
6687
40402안녕하십니까? ROLLUP 관련해서 문의드립니다. [2]
황인준
2014-03-13
7772
40400where rownum <= 10 order by crt_date desc 문의 [1]
이성근
2014-03-10
6357
40398이런 쿼리 가능할까요? [5]
이태우
2014-03-10
6949
40397뷰에 널값으로 컬럼 하나 추가 가능한가요?
민규
2014-03-07
6450
40396쿼리좀 도와주세요. [1]
초보
2014-03-06
6346
40395이태리에서 db작업이 가능할가요? [2]
김삼
2014-03-06
6305
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다