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 33167 게시물 읽기
No. 33167
초보입니다.
작성자
혀니(hanbada79)
작성일
2008-03-04 11:57
조회수
1,269

a라는 테이블은 


grade | day 라는 컬럼에

 1     | 20080301

 2     | 20080301 

 3     | 20080301

 4     | 20080301

 1     | 20080303

 1     | 20080304

 2     | 20080305

 3     | 20080308


이런식으로 데이터가 들어가 있을때


날짜별로 데이터를 가져오고 싶은데


select * from a where day = '20080301' (20080301에는 grade가 1, 2, 3, 4가 다 있으므로 불가)


하면 


rownum, grade, day

1       1        20080301       불가

2       2        20080301       불가

3       3        20080301       불가

4       4        20080301       불가


이라는 값이 항상 나오는데 


만약 20080308이라는 day값으로 검색했을때 (20080308에는 grade가 3만 있으므로 3은 불가, 나머지는 가능)


rownum,    grade, day

 1              1        20080308         가능

 2              2        20080308         가능

 3              3        20080308         불가

 4              4        20080308         가능


이렇게 출력을 하고 싶습니다. 


또는 20080305로 검색했을때    (20080305에는 grade가 2만 있으므로 2는 불가 나머지는 가능)


rownum, grade, day

1              1       20080305           가능

2              2       20080305           불가

3              3       20080305           가능

4              4       20080305           가능



다른것도 grade가 있으면 grade가 있는 rownum은 가능 하고 나머지는 불가 이렇게 데이터가 출력되게끔 하고 싶어요 


간단한거라도 좋으니 댓글 남겨주세요


(__)

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


SELECT ROWNUM,
       STD.DAY AS DAY,
       STD.GRADE AS GRADE,
       DECODE ( NVL(A.DAY, 0), 0, '불가능', '가능' ) FLAG
FROM A ,
(
SELECT DAY, GRADE
FROM (/* 입력 데이터의 MIN DAY, MAX DAY의 날을 구함. */
  SELECT TO_CHAR(TO_DATE(MIN_DAY, 'YYYYMMDD') -1 + LEVEL, 'YYYYMMDD') AS DAY
    FROM ( SELECT MIN(DAY) AS MIN_DAY, MAX(DAY) AS MAX_DAY FROM A )
  CONNECT BY TO_CHAR(TO_DATE(MIN_DAY, 'YYYYMMDD') -1 + LEVEL, 'YYYYMMDD') <= MAX_DAY ) CALENDAR,
  (/* GRADE 그룹 설정 */
  SELECT GRADE FROM A GROUP BY GRADE ) GRADE
) STD
WHERE STD.DAY = A.DAY (+)
  AND STD.GRADE = A.GRADE (+)
  AND STD.DAY = '20080308'
ORDER BY STD.DAY, STD.GRADE


1. A 테이블에 들어가 있는 그룹 내용을 뽑고, 
2. A 테이블에 들어가 있는 현재 데이터의 MIN DAY, MAX DAY를 가지고 날짜별 리스트를 뽑고
3. 1,2이용하여 나올수 있는 범위를 만들고,
4. A 테이블의 내용이 (DAY, GRADE)  만들어진 데이터리스트에 존재하면, 가능 아니면 불가능으로
    표현하도록 했습니다.

위의 질의문의 단점은.. 1번 항목의 A 테이블 내용이 많으면 많을수록 속도 저해 요인이 되며,
2번 항목 또한, 속도저해 요인이 될 수 있습니다.

범위를 임의로 지정해서 사용하신다면 문제없이 돌아가리라 생각되며,

고수님들이 더 간략화 하실 수 있을 겁니다. 참조만 하세요.

그럼, 즐프하세요.
뽀까님이 2008-03-04 15:27에 작성한 댓글입니다. Edit

감사합니다. 


어느정도 가닥이 잡힌거 같네요 ^^*

혀니님이 2008-03-04 16:21에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
33170고수님들 간단한 쿼리 질문 하나 드릴께요~ [1]
권종원
2008-03-04
1105
33169두개의 테이블 조인해서 페이징 처리하는 방법
이상재
2008-03-04
1239
33168왕초보 질문 입니다 ㅠ _ ㅠ [2]
비바
2008-03-04
1135
33167초보입니다. [2]
혀니
2008-03-04
1269
33166[질문]아우터 조인 관련 질문입니다 [1]
급질문
2008-03-04
1558
33165oracle 10g client 와 OraOLEDB....
이소미
2008-03-03
1474
33164트리구조에서 각 동일레벨간 비중에 따른 추진률 산정....... [4]
노지훈
2008-03-03
2933
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다