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 37923 게시물 읽기
No. 37923
다시 또 질문드립니다.
작성자
고민중
작성일
2010-09-01 14:51
조회수
2,805

Select A.PRG_CODE
     , A.PRG_DATE
     , NVL(B.PLAN_PRG_RATE, 0) PLAN_PRG_RATE
     , SUM(B.PLAN_PRG_RATE) OVER(ORDER BY A.PRG_CODE, A.PRG_DATE) PLAN_SUM_RATE
From (
        SELECT PRG_CODE, ADD_MONTHS(SDate, LEVEL - 1) PRG_DATE
          FROM (SELECT PRG_CODE
                     , MIN(PRG_DATE) SDate
                     , MAX(PRG_DATE) EDate
                  FROM STREALQT_S
                --Where PRG_CODE = 'T-001-006-001-003-001-003'
                Group By PRG_CODE
                )
         CONNECT BY LEVEL <= MONTHS_BETWEEN(EDate, SDate) + 1
     ) A
    , (
         SELECT PRG_CODE, PRG_DATE
             , PLAN_SUM_RATE - LAG(PLAN_SUM_RATE, 1, 0) OVER(ORDER BY PRG_CODE, PRG_DATE) PLAN_PRG_RATE
             , PLAN_SUM_RATE
         FROM STREALQT_S
         --Where PRG_CODE = 'T-001-006-001-003-001-003'   
    ) B
Where A.PRG_CODE = B.PRG_CODE
  And A.PRG_DATE = B.PRG_DATE(+)

 

도움을 받아 쿼리 작성을 했는데

시간이 너무 오래걸립니다.

2010-01-01 10 10
2010-02-01 20 30
2010-05-01 10 40
2010-06-01 30 70
2010-08-01 30 100

이테이블에 코드만 추가 된것인데 몇분이 지나도 답이 안나옵니다.

조인이 문제 인지...  테이블 하나두개 정도는 더 조인을 해야 하는데..

부탁드립니다.

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

원인은
처음부터 자세하게 잘문하셨어야 하는데 간단하게 압축해 질문했는데
그 압축된 질문에서 원래 있었어야 할 가장 중요한 요소가 빠진거죠.
원 질문에는 PRG_CODE에 대한 내용이 전혀 없었기 때문에
답글에서는 그에 대한 고려가 전혀 안되었던 거지요.
질문을 요약하는것까지는 좋은데. 빠지지 말아야 할 걸 빼면 안되죠.


1. 분석함수 구문이 잘못 되었구요.
변경전 : OVER(ORDER BY PRG_CODE, PRG_DATE)
변경후 : OVER(PARTITION BY PRG_CODE ORDER BY PRG_DATE)


2. a 집합을 만드는 구문이 잘못 되었습니다.
CONNECT BY LEVEL <= n 은 1행을 n행으로 만들때 사용되는 방법입니다
그러나 1행이 아닌 m행이 오게 되면 n행이 생기는게 아니라
기하급수적으로 큰 수의 행이 생성되게 됩니다.


SELECT prg_code
     , add_months(sdate, lv - 1) prg_date
  FROM (SELECT prg_code
             , MIN(prg_date) sdate
             , MAX(prg_date) edate
          FROM strealqt_s
         GROUP BY prg_code
        )
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
 WHERE lv <= MONTHS_BETWEEN(EDate, SDate) + 1
;


3. 혹시 또 빼먹으신건 없나요?
기간 조건이나 년도 조건을 준다던가?
기타 다른식의 필터조건을 준다거나? 하는거요.
사소한 것 하나에 쿼리는 180도 달라질 수 있습니다.

마농(manon94)님이 2010-09-01 15:49에 작성한 댓글입니다.
이 댓글은 2010-09-01 15:52에 마지막으로 수정되었습니다.

아우터 조인도 잘못 되었네요.
 Where A.PRG_CODE = B.PRG_CODE(+)
   And A.PRG_DATE = B.PRG_DATE(+)

마농(manon94)님이 2010-09-02 09:40에 작성한 댓글입니다.

마농님 정말 감사합니다.

다음부터는 첫 질문을 제대로 해야겠습니다.

 

고민중님이 2010-09-02 17:01에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
37926000 ==> 100 또는 100 ==> 100으로 마스크하는 쿼리 [2]
jack11
2010-09-02
2535
37925오라클 import [1]
정재영
2010-09-01
2889
37924sql developer 로 export한 sql 데이터 import 하기 질문 [1]
전정주
2010-09-01
6524
37923다시 또 질문드립니다. [3]
고민중
2010-09-01
2805
37922sql_trace = false 인데 trace 파일이 생겨요.
박철
2010-09-01
2676
37920다시 쿼리 질문 드립니다. [3]
고민중
2010-09-01
3082
37919바인딩 변수를 왜 사용하나요? [3]
정현도
2010-08-31
4951
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다