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 38905 게시물 읽기
No. 38905
query에서 조건으로 select하기
작성자
한상원(ennedi)
작성일
2011-09-26 12:07
조회수
5,555

안녕하세요..애매모호한 쿼리가 있어서 질문드립니다.

아래 쿼리를 돌리면 결과가

SELECT CSSHCD, CSGOCD, CSSTDT, CSENDT, CSSEAM               
FROM SCCOSTTB                                         
WHERE csgocd = '5609215'     
ORDER BY csgocd, csstdt  

결과>

CSSHCD    CSGOCD    시작일      종료일           금액
020237    5609215    20080624    99999999    1500
020237    5609215    20080625    20080731    1500
020237    5609215    20080701    20080731    1500
020237    5609215    20080801    20080831    1500
020237    5609215    20110601    20110630    1800
020237    5609215    20110701    20110731    1800
020237    5609215    20110801    20110831    1800

-------------------------------------------------------------------------------------(0)
020237    5609215    20110901    99999999    1800    <----------(1)
020237    5609215    20110901    20110930    1600    <----------(2)

이렇게 나옵니다.

여기서 원하는 결과는 2011/ 9/26일날 쿼리를 select 하면 (0)번까지 나오고 (2)번 결과가 나오게 ....

그리고 20110901~20110930 이후에 쿼리를 select하면  (0)번까지 나오고 (1)번 결과가 나오게....

이런 쿼리가 가능할까요..?

답변 부탁드립니다..좋은 하루 보내세요~

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

질문이 잘 이해가 안되네요.

조회하는 시점에 따라 특정 결과를 포함하거나 제거하길 원하시는건가요 ?

 

     AND ( ( TO_DATE(SYSDATE, 'YYYYMM') = '201109'
         AND 종료일 = '20110930' )
        OR ( TO_DATE(SYSDATE, 'YYYYMM') <> '201109'
         AND 종료일 = '99999999' ) )

 

질문에 의해 파악된 요지는 이건데... 왠지... 원하시는 거는 아닐꺼 같네요.

암비(cloudlyu)님이 2011-09-26 15:44에 작성한 댓글입니다.

왜 그런 결과가 나오는지에 대한 설명이 없네요.

데이터만 가지고 유추하기에는 데이터도 앞뒤가 안맞는것 같네요.

마농(manon94)님이 2011-09-26 15:47에 작성한 댓글입니다.

답변 감사드립니다.

왜 그런 결과가 나오는지의 설명은....음....서버에서 자료를 만들고 클라이언트에서

수신받은결과 저 SCCOSTTB 에 결과>처럼 저장됩니다.

새로운 상품일 경우 시작일이 같은 레코드가 2개일 경우가 있는데 현재 select를 한 날짜가

행사기간에 ( 20110901 ~ 20110930 ) 포함된다고 하면 1,600원짜리 레코드가 select되야하고

행사기간이 끝나면 1,800원짜리가 select 되야 됩니다. 그래야 코드를 스캔했을경우 올바른

가격을 가져오게 하기 위해서입니다.

 

ex) 2011.09.27 일 조회한다.

결과)

CSSHCD    CSGOCD    시작일      종료일           금액
020237    5609215    20080624    99999999    1500
020237    5609215    20080625    20080731    1500
020237    5609215    20080701    20080731    1500
020237    5609215    20080801    20080831    1500
020237    5609215    20110601    20110630    1800
020237    5609215    20110701    20110731    1800
020237    5609215    20110801    20110831    1800
020237    5609215    20110901    20110930    1600<----------

ex) 2011.10.1 조회한다

CSSHCD    CSGOCD    시작일      종료일           금액
020237    5609215    20080624    99999999    1500
020237    5609215    20080625    20080731    1500
020237    5609215    20080701    20080731    1500
020237    5609215    20080801    20080831    1500
020237    5609215    20110601    20110630    1800
020237    5609215    20110701    20110731    1800
020237    5609215    20110801    20110831    1800
020237    5609215    20110901    99999999    1800<---------

이렇게 조회하기를 원합니다.

질문하는 저도 쬐금 이해가 안가려고 하지만...

 

 

한상원(ennedi)님이 2011-09-26 16:13에 작성한 댓글입니다.

WITH sccosttb AS
(
SELECT '020237' csshcd, '5609215' csgocd, '20080624' csstdt, '99999999' csendt, 1500 csseam FROM dual
UNION ALL SELECT '020237', '5609215', '20080625', '20080731', 1500 FROM dual
UNION ALL SELECT '020237', '5609215', '20080701', '20080731', 1500 FROM dual
UNION ALL SELECT '020237', '5609215', '20080801', '20080831', 1500 FROM dual
UNION ALL SELECT '020237', '5609215', '20110601', '20110630', 1800 FROM dual
UNION ALL SELECT '020237', '5609215', '20110701', '20110731', 1800 FROM dual
UNION ALL SELECT '020237', '5609215', '20110801', '20110831', 1800 FROM dual
UNION ALL SELECT '020237', '5609215', '20110901', '99999999', 1800 FROM dual
UNION ALL SELECT '020237', '5609215', '20110901', '20110930', 1600 FROM dual
)
SELECT csshcd, csgocd, csstdt, csendt, csseam
  FROM (
        SELECT csshcd, csgocd, csstdt, csendt, csseam
             , ROW_NUMBER() OVER(
               PARTITION BY csshcd, csgocd, csstdt
               ORDER BY CASE WHEN csendt >= TO_CHAR(sysdate, 'yyyymmdd')
                             THEN csendt END
               ) rn
          FROM sccosttb
         WHERE csgocd = '5609215'
        )
 WHERE rn = 1
;

마농(manon94)님이 2011-09-26 16:54에 작성한 댓글입니다.
이 댓글은 2011-09-26 16:55에 마지막으로 수정되었습니다.

빠른답변 감사합니다.

테스트진행중입니다. 좋은하루 보내세요..^^

 

한상원(ennedi)님이 2011-09-26 17:28에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
389081:0,1 릴레이션 테이블 설계 질문 [2]
2011-09-27
4354
38907오라클 SQL에서 변수 선언은 어떻게 하나요? [3]
조동건
2011-09-26
4777
38906Add Month [2]
하홍민
2011-09-26
4532
38905query에서 조건으로 select하기 [5]
한상원
2011-09-26
5555
38904오라클 DB 연결방식 질문 [1]
김수진
2011-09-26
5876
38903[DBA] 온라인백업 데이터로 DB복원하는 법 [2]
임서희
2011-09-25
4105
38900E.Message값 변수로 받기
아폴론
2011-09-23
3721
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다