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 40219 게시물 읽기
No. 40219
이런 결과값을 구할수 있을까요?
작성자
이선
작성일
2013-08-05 09:25
조회수
6,880

안녕하세요.

다음 2개의 테이블이 있습니다.

테이블 A

ID
A
B
C
D
E
F
G

테이블 B

ID LEVEL NO
A 3 EV1307011
B 5 EV1307019
B 3 EV1307012
C 3 EV1307013
D 3 EV1307009
E 3 EV1307014
F 3 EV1307015
G 3 EV1307018

이 2개의 테이블을 가지고

다음 2개의 결과가 가능할까요?

ID LEVEL NO   ID LEVEL NO
A 3 EV1307011   A 3 EV1307011
B 3 EV1307012   B 5 EV1307019
C 3 EV1307013   C 3 EV1307013
D 3 EV1307009   D 3 EV1307009
E 3 EV1307014   E 3 EV1307014
F 3 EV1307015   F 3 EV1307015
G 3 EV1307018   G 3 EV1307018

고수님들 도움 부탁드립니다.

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

1) B 의 값이 3개 이상은 되지 않나요?

      ( 유동적으로 2 ~ 5 개 이상..)

2) 다른 ID 값이 2개 이상 될 경우는 없나요?

    ( B - 2개, D - 2개 )


 

아린(arin76)님이 2013-08-05 10:17에 작성한 댓글입니다.
이 댓글은 2013-08-05 10:20에 마지막으로 수정되었습니다.

ID에 따라서 LEVEL이 여러개가 될수 있습니다.

지금처럼 ID = B일때 LEVEL이 3,5로 되어있듯이...

유동적입니다.

결과조회시 ID는 1개씩 나와야합니다.

관심 감사드립니다.

이선님이 2013-08-05 10:28에 작성한 댓글입니다.
이 댓글은 2013-08-05 10:29에 마지막으로 수정되었습니다. Edit
WITH a(id) AS(
SELECT 'A' FROM dual UNION ALL
SELECT 'B' FROM dual UNION ALL
SELECT 'C' FROM dual UNION ALL
SELECT 'D' FROM dual UNION ALL
SELECT 'E' FROM dual UNION ALL
SELECT 'F' FROM dual UNION ALL
SELECT 'G' FROM dual
), b(id, lv, no) AS(
SELECT 'A', 3, 'EV1307011' FROM dual UNION ALL
SELECT 'B', 6, 'EV1307021' FROM dual UNION ALL
SELECT 'B', 5, 'EV1307019' FROM dual UNION ALL
SELECT 'B', 3, 'EV1307012' FROM dual UNION ALL
SELECT 'C', 3, 'EV1307013' FROM dual UNION ALL
SELECT 'D', 4, 'EV1307010' FROM dual UNION ALL
SELECT 'D', 3, 'EV1307009' FROM dual UNION ALL
SELECT 'E', 3, 'EV1307014' FROM dual UNION ALL
SELECT 'F', 3, 'EV1307015' FROM dual UNION ALL
SELECT 'G', 3, 'EV1307018' FROM dual
)
SELECT id, lv1, no1
     , COALESCE(lv2, lv1)      lv2, COALESCE(no2, no1)      no2
     , COALESCE(lv3, lv2, lv1) lv3, COALESCE(no3, no2, no1) no3
     -- 유동적일경우 추가 처리
  FROM (SELECT id
             , MIN(DECODE(rn, 1, lv)) lv1, MIN(DECODE(rn, 1, no)) no1
             , MIN(DECODE(rn, 2, lv)) lv2, MIN(DECODE(rn, 2, no)) no2
             , MIN(DECODE(rn, 3, lv)) lv3, MIN(DECODE(rn, 3, no)) no3
             -- 유동적일경우 추가처리 
          FROM (SELECT b.id, b.lv, b.no  
                     , ROW_NUMBER() OVER(PARTITION BY b.id ORDER BY lv) rn
                  FROM a, b
                 WHERE a.id = b.id
                ) 
         GROUP BY id        
         ORDER BY id
        ) 
 
아린(arin76)님이 2013-08-05 11:17에 작성한 댓글입니다.

아린님 너무 감사합니다.

혹시 불가능한게 아닐까하고 생각하고 있었는데

너무 멋지게 만들어주셨네요.

근데..제 설명이 너무 부족했나봅니다.

아린님이 만들어주신것 처럼 유동적으로 데이터가 가로로 보일필요는 없구요.

level이 조건으로 들어가게 됩니다.

level  = 3, level = 5

id에 대해서 모든 레벨이 다 존재하는게 아니라서 질문을 드린거거든요.

조건 level =3

id || level || no

A || 3      || EV1307011

B || 3       || EV1307019

조건 level = 5

id || level || no

A || 3      || EV1307011

B || 5       || EV1307021

이렇게 하려고 합니다.

만들어주신걸로 해보려고 하는데 잘 안되네요.

ㅜㅜ

이선님이 2013-08-05 17:29에 작성한 댓글입니다. Edit

기본 default 로 level = 3 을 지정했고요.

변수로 p_lv 에 원하는 level 값을 정하시면 될듯합니다.

 

 SELECT a.id -- b.lv, b.no

     , MAX(b.lv) lv
     , MAX(b.no) KEEP(DENSE_RANK LAST ORDER BY b.lv) no  
  FROM a, b
 WHERE a.id = b.id(+)
   AND b.lv IN (3, :p_lv)
 GROUP BY a.id  
 
아린(arin76)님이 2013-08-05 17:51에 작성한 댓글입니다.
이 댓글은 2013-08-05 17:51에 마지막으로 수정되었습니다.

헉!!!!!!!!!!

이렇게나 빨리........

정말이지 너무너무 감사합니다.

복 많이 받으실꺼에요.

더운 여름에 건강하시구요.

앞으로도 많으 도움 부탁드립니다.

정말 감사합니다.

이선님이 2013-08-05 17:54에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40222쿼리 질문드립니다. [5]
깨비
2013-08-08
5669
40221SQL Developer에서 오라클 접속이 되지 않습니다. [1]
주재환
2013-08-06
10787
40220(꼭 부탁)local index partition unique질문입니다. [1]
초봉~
2013-08-05
5932
40219이런 결과값을 구할수 있을까요? [6]
이선
2013-08-05
6880
40218마농님 다시 부탁드립니다! [2]
김정훈
2013-08-02
6643
40217쿼리 문의드립니다..생각처럼 좀 안되네여 [7]
새하정
2013-08-01
7169
40216explain plan의 값 확인 [1]
초보디비
2013-07-31
6857
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다