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 39624 게시물 읽기
No. 39624
유동적으로 쿼리 데이터가 더 많이 조회되는 쿼리 문의드립니다.
작성자
때지
작성일
2012-09-06 13:51ⓒ
2012-09-06 14:17ⓜ
조회수
4,913

안녕하세요.

유동적으로 데이터 조회하는 쿼리 문의드립니다.

 

데이터는 아래 표와 같고

한 UP_PK_NO를 가지고 년도별로 PK_NO가 생성되는데 UP_PK_NO를 기준으로 HM_ID가 있건 이전 SUBJECT는 다 조회할 수 있어야 합니다.

UP_PK_NO는 다른 테이블의 KEY입니다. 아래 테이블과는 부모-자식간의 관계를 갖는다 할 수 있습니다.

일단 PK_NO부터 HM_ID 까지가 테이블에 저장된 데이터이며, (색상 표시) 

HM001부터 HM004 까지는 해당 ROW를 HM00X가 볼 수 있으면 O로 표시하였습니다.

 

PK_NO UP_KP_NO YEAR HM_ID   HM001 HM002 HM003 HM004
SBJ0012008 SBJ001 2008 HM001   o o o  
SBJ0012009 SBJ001 2009 HM001   o o o  
SBJ0012010 SBJ001 2010 HM002     o o  
SBJ0012011 SBJ001 2011 HM003       o  
SBJ0022011 SBJ002 2011 HM002     o   o
SBJ0022012 SBJ002 2012 HM004         o

 

위와 같은 경우로 데이터가 나와야 할 쿼리 RESULT는 아래와 같습니다.

 

PK_NO UP_KP_NO YEAR HM_ID
SBJ0012008 SBJ001 2008 HM001
SBJ0012008 SBJ001 2008 HM002
SBJ0012008 SBJ001 2008 HM003
SBJ0012009 SBJ001 2009 HM001
SBJ0012009 SBJ001 2009 HM002
SBJ0012009 SBJ001 2009 HM003
SBJ0012010 SBJ001 2010 HM002
SBJ0012010 SBJ001 2010 HM003
SBJ0012011 SBJ001 2011 HM003
SBJ0022011 SBJ002 2011 HM002
SBJ0022011 SBJ002 2011 HM004
SBJ0022012 SBJ002 2012 HM004

 

SUBJECT별로 HM_ID의 시작년도와 종료년도가 틀려서 쿼리 만들기가 쉽지 않네요;;;

데이터가 들어있는 쿼리는 아래와 같습니다.

아래 활용해서 답변 부탁드립니다//

 


WITH TBL AS (
        SELECT 'SBJ00012008' AS PK_NO
             , 'SBJ0001'     AS UP_PK_NO
             , '2008'        AS YEAR
             , 'HM001'       AS HM_ID
          FROM DUAL
         UNION
        SELECT 'SBJ00012009'
             , 'SBJ0001'
             , '2009'
             , 'HM001' 
          FROM DUAL 
         UNION
        SELECT 'SBJ00012010'
             , 'SBJ0001'
             , '2010'
             , 'HM002' 
          FROM DUAL 
         UNION
        SELECT 'SBJ00012011'
             , 'SBJ0001'
             , '2011'
             , 'HM003' 
          FROM DUAL 
         UNION
        SELECT 'SBJ00022011'
             , 'SBJ0002'
             , '2011'
             , 'HM002' 
          FROM DUAL 
         UNION
        SELECT 'SBJ00022012'
             , 'SBJ0002'
             , '2012'
             , 'HM005' 
          FROM DUAL 
)
SELECT *
  FROM TBL 
;

 

 

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

-- 1. Self Join : 동일 테이블 두번 읽음
SELECT a.pk_no, a.up_pk_no, a.year, a.hm_id
     , MIN(DECODE(b.hm_id, 'HM001', 'o')) hm001
     , MIN(DECODE(b.hm_id, 'HM002', 'o')) hm002
     , MIN(DECODE(b.hm_id, 'HM003', 'o')) hm003
     , MIN(DECODE(b.hm_id, 'HM004', 'o')) hm004
     , MIN(DECODE(b.hm_id, 'HM005', 'o')) hm005
  FROM tbl a
     , tbl b
 WHERE a.up_pk_no = b.up_pk_no
   AND a.year <= b.year
 GROUP BY a.pk_no, a.up_pk_no, a.year, a.hm_id
 ORDER BY pk_no
;


-- 2. Analitic Function(분석함수) : 테이블 한번만 읽고도 가능
SELECT pk_no, up_pk_no, year, hm_id
     , MIN(DECODE(hm_id, 'HM001', 'o')) OVER(PARTITION BY up_pk_no ORDER BY year DESC) hm001
     , MIN(DECODE(hm_id, 'HM002', 'o')) OVER(PARTITION BY up_pk_no ORDER BY year DESC) hm002
     , MIN(DECODE(hm_id, 'HM003', 'o')) OVER(PARTITION BY up_pk_no ORDER BY year DESC) hm003
     , MIN(DECODE(hm_id, 'HM004', 'o')) OVER(PARTITION BY up_pk_no ORDER BY year DESC) hm004
     , MIN(DECODE(hm_id, 'HM005', 'o')) OVER(PARTITION BY up_pk_no ORDER BY year DESC) hm005
  FROM tbl
 ORDER BY pk_no
;

마농(manon94)님이 2012-09-06 19:59에 작성한 댓글입니다.
이 댓글은 2012-09-12 13:40에 마지막으로 수정되었습니다.

select b.pk_no, b.up_pk_no, b.year, a.hm_id
  from (select distinct up_pk_no, hm_id
          from tbl
       )  a,
       (SELECT pk_no, up_pk_no, year, hm_id
          FROM TBL
       )  b 
 where a.up_pk_no = b.up_pk_no
   and a.hm_id   >= b.hm_id
 order by pk_no, up_pk_no, year, hm_id

 

준(BBANGGGU)님이 2012-09-11 16:59에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39628oracle odbc로 접속후 where 절에 한글 검색을 하면 안나옵니다.
막시무스
2012-09-07
4805
39627기간별 이력 쿼리 질문 드립니다. [2]
논어
2012-09-07
5004
39625벌크인서트 질문입니다. [1]
홍두표
2012-09-06
4689
39624유동적으로 쿼리 데이터가 더 많이 조회되는 쿼리 문의드립니다. [2]
때지
2012-09-06
4913
39623테이블 스페이스 확장 에러에 대해 [2]
이무용
2012-09-06
8118
39622가장많이 나온 번호 쿼리 알려주실분 어려워요 [1]
축구
2012-09-05
4900
39621이럴때는 update 어떻게 해야하나요..? [3]
한상원
2012-09-04
4974
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다