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 24007 게시물 읽기
No. 24007
쿼리좀 도와주세요.
작성자
고운님
작성일
2005-09-08 13:18
조회수
1,759

 

상품코드

기준일자

가격

101 20050801 1000
101 20050805 2000
101 20050810 1000
중략
101 20050905 2000
101 20050907 3000
102 중략
102
103
103


 

데이타가 위와같이 존재합니다.

상품코드별 기준일자에 가격이 정해져 있습니다.

원하는 결과는 기준일자를 조건을 주면 상품코드별로 이전일자와의 가격의 등락폭을 구하고자 하는 것입니다.

기준일자는 연속되어 있는것이 아니므로 조건으로 주어진 일자보다 작은 것중 최근일자의 가격을 구하면 됩니다.

그래서 기준일자의 가격과 기준일자 이전 최근일자의 가격을 비교하여 등락폭을 구하면 됩니다.

각각의 쿼리는 되는데... 두개를 한꺼번에 구하려고 하니 안됩니다.

조언을 구합니다.

 

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

select A.*,B.가격 이전가격

from 테이블 A , 테이블 B

where A.상품코드=B.상품코드

and A.기준일자>B.기준일자

and A.기준일자='원하는일자'

 

해보3...

이경환(babocom)님이 2005-09-08 13:27에 작성한 댓글입니다.
이 댓글은 2005-09-08 13:27에 마지막으로 수정되었습니다.

이경환님 답변 감사드립니다.

갈켜준 대로해서 해결되었습니다.

좋은일이 있기를 바랍니다.

한가지 궁굼한점이 있는데요...

and A.기준일자>B.기준일자

이렇게 조건을 주었는데... A.기준일자 이전 최근일자를 어떻게 가져오죠?

잘 이해가 안가서요..

고운님님이 2005-09-08 13:35에 작성한 댓글입니다.
이 댓글은 2005-09-08 13:37에 마지막으로 수정되었습니다. Edit

비이~밀~!

이경환(babocom)님이 2005-09-08 13:47에 작성한 댓글입니다.

이경환님 보세요...

여러번 테스트를 해보니까.. 데이타가 정상적으로 나오지 않아요..

상품코드별 기준일자 전일(최근일) 의 데이타가 하나만 나와야 하는데.. 그렇지 않아요.

그러니까 같은 상품코드의 전일(최근일) 가격을 가져오지 못합니다.

전일(최근일)이 없을수도 있는데 그때는 전일 가격은 0 이 됩니다.

해결하나 했더니.. 좀 도와주세요

 

고운님님이 2005-09-08 13:49에 작성한 댓글입니다.
이 댓글은 2005-09-08 13:50에 마지막으로 수정되었습니다. Edit

아하... 전일가격이 없으면 안나오죠~~ 

그럼 outer join 을 써야하는데... 빈날짜 채워넣을수도 없고...

좀 속도는 느리겠지만...

select 상품코드,기준일자,가격,(

select P.가격 from (

select rownum rnum,가격 from 테이블 A 

where A.상품코드=B.상품코드 and A.기준일자<B.기준일자

order by 기준일자

) P where P.rnum=1

) 이전가격

from 테이블 B

 

이전가격이 null 값이면 없는걸로 생각하세요~

위와같은 형식을 subselect 라고 하죠...  효율을 엄청 떨어뜨리는...

불가피한 상황이 아니면 절대로 쓰지 말아야 할...

이경환(babocom)님이 2005-09-08 14:19에 작성한 댓글입니다.
이 댓글은 2005-09-08 14:23에 마지막으로 수정되었습니다.

해당 테이블명을 test, 각각의 칼럼명을 col1 (상품코드), col2 (기준일자), col3 (가격)이라고 가정하면,

 

SELECT   a.col1, a.col2, a.col3, a.col3 - b.col3
    FROM TEST a, TEST b
   WHERE (a.col1 = b.col1 AND b.col2 =
                                      (SELECT MAX (col2)
                                         FROM TEST
                                        WHERE col1 = a.col1 AND col2 < a.col2)
         )
      OR (    a.col1 = b.col1
          AND a.col2 = b.col2
          AND (SELECT MAX (col2)
                 FROM TEST
                WHERE col1 = a.col1 AND col2 < a.col2) IS NULL
         )
ORDER BY a.col1, a.col2

 

-- Oracle SQL Tuning 까페 http://cafe.daum.net/oraclesqltuning

장진주(zozogirl)님이 2005-09-08 18:45에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
24010컴파일이 안됩니다. ㅡ.ㅡ [2]
진익섭
2005-09-08
1487
24009테이블 스페이스 확인좀 부탁드립니다. [3]
노형석
2005-09-08
1940
24008행별로 구분하고 싶습니다. [5]
궁굼이
2005-09-08
1608
24007쿼리좀 도와주세요. [6]
고운님
2005-09-08
1759
24006SunOS의 오라클 서버에서 exp로 덤프뜰때... [4]
윤아라
2005-09-08
6143
24005select 에서 중복데이터 제거.. [2]
백수환
2005-09-08
2250
24004프로시져 작성에 관해서 [1]
초보탈출
2005-09-08
2287
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다