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 39412 게시물 읽기
No. 39412
쿼리문 문의 드립니다 SELECT ROW별 검색 조건
작성자
최상민(roice81)
작성일
2012-04-24 16:26ⓒ
2015-01-23 14:24ⓜ
조회수
5,425

 

예제는 다음과 같습니다.

WITH T AS ( SELECT 1 SEQ, '영희' AA, NULL BB, '수학' FLAG, 20 FLAG2 FROM DUAL UNION ALL SELECT 2 SEQ, '영희' AA, NULL BB, '수학' FLAG, 21 FLAG2 FROM DUAL UNION ALL SELECT 3 SEQ, '영희' AA, NULL BB, '수학' FLAG, 23 FLAG2 FROM DUAL UNION ALL SELECT 4 SEQ, '영희' AA, NULL BB, '수학' FLAG, 26 FLAG2  FROM DUAL UNION ALL SELECT 5 SEQ, '영희' AA, 0 BB, '과학' FLAG, 37 FLAG2  FROM DUAL UNION ALL SELECT 6 SEQ, '영희' AA, 1 BB, '과학' FLAG, 38 FLAG2  FROM DUAL UNION ALL SELECT 7 SEQ, '영희' AA, NULL BB, '과학' FLAG, 40 FLAG2  FROM DUAL UNION ALL SELECT 8 SEQ, '영희' AA, NULL BB, '국어' FLAG, 41 FLAG2  FROM DUAL UNION ALL SELECT 9 SEQ, '영희' AA, NULL BB, '국어' FLAG, 44 FLAG2  FROM DUAL UNION ALL SELECT 10 SEQ, '영희' AA, NULL BB, '국어' FLAG, 49 FLAG2  FROM DUAL UNION ALL SELECT 11 SEQ, '철수' AA, NULL BB, '수학' FLAG, 50 FLAG2  FROM DUAL UNION ALL SELECT 12 SEQ, '철수' AA, NULL BB, '수학' FLAG, 53 FLAG2  FROM DUAL UNION ALL SELECT 13 SEQ, '철수' AA, NULL BB, '수학' FLAG, 55 FLAG2  FROM DUAL UNION ALL SELECT 14 SEQ, '철수' AA, NULL BB, '수학' FLAG, 58 FLAG2  FROM DUAL UNION ALL SELECT 15 SEQ, '철수' AA, NULL BB, '수학' FLAG, 60 FLAG2  FROM DUAL UNION ALL SELECT 16 SEQ, '철수' AA, NULL BB, '수학' FLAG, 61 FLAG2  FROM DUAL UNION ALL SELECT 17 SEQ, '철수' AA, NULL BB, '수학' FLAG, 63 FLAG2  FROM DUAL UNION ALL SELECT 18 SEQ, '철수' AA, 0 BB, '과학' FLAG, 64 FLAG2  FROM DUAL UNION ALL SELECT 19 SEQ, '철수' AA, NULL BB, '과학' FLAG, 65 FLAG2  FROM DUAL UNION ALL SELECT 20 SEQ, '철수' AA, NULL BB, '국어' FLAG, 66 FLAG2  FROM DUAL UNION ALL SELECT 21 SEQ, '제인' AA, NULL BB, '수학' FLAG, 67 FLAG2  FROM DUAL UNION ALL SELECT 22 SEQ, '제인' AA, NULL BB, '수학' FLAG, 68 FLAG2  FROM DUAL UNION ALL SELECT 23 SEQ, '제인' AA, NULL BB, '과학' FLAG, 69 FLAG2  FROM DUAL UNION ALL SELECT 24 SEQ, '제인' AA, 1 BB, '과학' FLAG, 73 FLAG2  FROM DUAL UNION ALL SELECT 25 SEQ, '제인' AA, NULL BB, '과학' FLAG, 74 FLAG2  FROM DUAL UNION ALL SELECT 26 SEQ, '제인' AA, NULL BB, '국어' FLAG, 75 FLAG2  FROM DUAL UNION ALL SELECT 27 SEQ, '제인' AA, NULL BB, '국어' FLAG, 76 FLAG2  FROM DUAL UNION ALL SELECT 28 SEQ, '제인' AA, NULL BB, '국어' FLAG, 77 FLAG2  FROM DUAL UNION ALL SELECT 29 SEQ, '제인' AA, NULL BB, '국어' FLAG, 79 FLAG2  FROM DUAL UNION ALL SELECT 30 SEQ, '제인' AA, NULL BB, '국어' FLAG, 90 FLAG2  FROM DUAL)     SELECT * FROM T

 

 

제가 얻고자 하는 결과값은 

          수학     과학0     과학1     국어

영희    20         37         38           49

철수    50         64         65           66

제인    67         69         73           90

 

문제는

수학점수는 학생별 최소값

국어점수는 학생별 최대값

여기까지는 별 문제가 없는데

 

과학 0과 1값을 구하기가 어렵네요 ㅜㅜ 나름 머리를 굴리는데

과학항목에서 BB값이 0, 1둘다 있으면 문제가 되지 않으나

0 또는 1이 없는 경우 가 문제가 됩니다.

0이 없을경우 1을 기준으로 이전값중 가장 가까운 값을 가져와야하고요

1이 없을경우는 0을 기준으로 다음값중 가장 가까운 값을 가져오는 쿼리문입니다.

 

SEQ는 순번이고 BB는 0또는 1 이외는 없습니다 이름별로 0, 1 한셋트이고요, Flag는 순번과 마찬가지로 증가값입니다.

 

프로그램을 제작하지 않고 쿼리로만 하려고 하니 힘드네요 ㅠㅠ

 

도움을 부탁드리겠습니다.

 

감사합니다.

 

 

 

 

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

SELECT aa
     , MIN(수학) 수학
     , NVL(MIN(과학0), MIN(flag1)) 과학0
     , NVL(MIN(과학1), MIN(flag3)) 과학1
     , MAX(국어) 국어
  FROM (SELECT seq, aa, bb, flag, flag2
             , DECODE(flag, '수학', flag2) 수학
             , DECODE(flag, '국어', flag2) 국어
             , DECODE(flag||bb, '과학0', flag2) 과학0
             , DECODE(flag||bb, '과학1', flag2) 과학1
             , DECODE(flag||bb, '과학1'
             , LAG (flag2) OVER(PARTITION BY aa, flag ORDER BY seq)) flag1
             , DECODE(flag||bb, '과학0'
             , LEAD(flag2) OVER(PARTITION BY aa, flag ORDER BY seq)) flag3
          FROM t
        )
 GROUP BY aa
;

마농(manon94)님이 2012-04-24 18:32에 작성한 댓글입니다.

마농님 매번 감사합니다~~

최상민(roice81)님이 2012-04-25 09:17에 작성한 댓글입니다.

LAG, LEAD 를 몰라서 이렇게 만들어봤는데... ㅎㅎ 쫌 무식한가요?!

select t1.aa,
       수학,
       과학0,
       과학1,
       국어
from   (select aa,
               min(decode(flag, '수학', flag2)) "수학",
               max(decode(flag, '국어', flag2)) "국어"
        from   t
        where  flag <> '과학'
        group by aa)t1,
       (select aa,
               nvl(min(decode(bb, 0, flag2)), min(decode(bb, 1, flag3))) "과학0",
               nvl(min(decode(bb, 1, flag2)), min(decode(bb, 0, flag3))) "과학1"
        from   (select t1.seq,
                       t1.aa,
                       t1.bb,
                       t1.flag,
                       t1.flag2,
                       t2.flag2 flag3
                from   (select seq,
                               rank() over (partition by aa, flag
                                order by seq) rnk,
                               aa,
                               bb,
                               flag,
                               flag2
                        from   t
                        where  flag = '과학')t1 left outer join
                        (select rank() over (partition by aa, flag
                                order by seq) rnk, aa, bb, flag, flag2
                        from   t
                        where  flag = '과학')t2 on t1.aa = t2.aa and t1.flag = t2.flag and t1.rnk = decode(t1.bb, 0, t2.rnk-1, 1, t2.rnk+1) )
        group by aa)t2
where  t1.aa = t2.aa ;
 

임병천(bchlim)님이 2012-04-25 11:40에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39415sql 도움 부탁드립니다 [3]
초보
2012-04-25
4923
39414ORA-01841 오류 [2]
신동화
2012-04-25
6394
39413쿼리 문의 [1]
진희
2012-04-24
4257
39412쿼리문 문의 드립니다 SELECT ROW별 검색 조건 [3]
최상민
2012-04-24
5425
39411sql 도움 부탁드립니다 [3]
오라클초보
2012-04-23
4258
39410조건문을 SQL에 포함 하고자 합니다. [1]
최상원
2012-04-20
4440
39409ORA-03127 [1]
이성규
2012-04-20
5542
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다