서브쿼리 조언좀 부탁드립니다.. 0 2 2,359

by 초슈꽃 [Oracle 기초] 서브쿼리 [2014.08.28 21:17:59]


안녕하세요 구루비 회원님들~

조회 조건의 어려움이 있어 이렇게 부탁 드려봅니다.

번호(NO) 이름(NAME) 생일(B) 몸무게(W) 비고
1 홍길동 1981-07 80  
2 홍길동 1981-06 90  
3 홍길동 1981-06 90  

이런 데이터가 있다고 가정했을때

3명의 홍길동 중

1. 같은 3명의 이름중에 생일이 가장 빠른 사람들로 부터 묶는다. (2번과 3번)

2. 묶은 그룹중 몸무게가 가장 많이 나가는 사람을 묶는다. (둘다 몸무게가 같으므로 다시 2번과 3번)

3. 또 묶은 그룹중 번호가 가장 많은 사람으로 묶는다 ( 결론 : 번호 3번)

이렇게 서브쿼리를 사용하여 표현하고싶은데 어려움이 있어서 질문드립니다.

* 테이블 이름이 AAA 라는 가정하에

SELECT *
  FROM AAA     AA
 WHERE AA.B    = ( SELECT MIN(BB.B)
                     FROM AAA        BB
                    WHERE BB.NAME    = AA.NAME
        	 )

이렇게 하면 우선 생일이 가장빠른 1981-06인 2번과 3번 두사람이 묶이는걸 볼수있는데

그 후로 막히네요 시원한 답변 부탁 드립니다 ^^

by madcat [2014.08.29 07:56:06]

아래와 같은 것을 원하시는 게 아닌가요? 

WITH AAA AS
(
SELECT 1 NO, '홍길동' NAME, '1981-07' B,  80 W FROM DUAL UNION ALL
SELECT 2 NO, '홍길동' NAME, '1981-06' B,  90 W FROM DUAL UNION ALL
SELECT 3 NO, '홍길동' NAME, '1981-06' B,  90 W FROM DUAL UNION ALL
SELECT 4 NO, '홍길동' NAME, '1981-07' B, 100 W FROM DUAL UNION ALL
SELECT 5 NO, '홍길순' NAME, '1981-10' B,  80 W FROM DUAL UNION ALL
SELECT 6 NO, '홍길순' NAME, '1981-05' B,  70 W FROM DUAL UNION ALL
SELECT 7 NO, '홍길순' NAME, '1981-05' B,  70 W FROM DUAL UNION ALL
SELECT 8 NO, '홍길순' NAME, '1981-05' B,  65 W FROM DUAL
)
SELECT NO, NAME, B, W
  FROM (
        SELECT NO, NAME, B, W,
               ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY B ASC, W DESC, NO DESC) RN 
          FROM AAA
       )
WHERE RN = 1
;

또는 
 
WITH AAA AS
(
SELECT 1 NO, '홍길동' NAME, '1981-07' B,  80 W FROM DUAL UNION ALL
SELECT 2 NO, '홍길동' NAME, '1981-06' B,  90 W FROM DUAL UNION ALL
SELECT 3 NO, '홍길동' NAME, '1981-06' B,  90 W FROM DUAL UNION ALL
SELECT 4 NO, '홍길동' NAME, '1981-07' B, 100 W FROM DUAL UNION ALL
SELECT 5 NO, '홍길순' NAME, '1981-10' B,  80 W FROM DUAL UNION ALL
SELECT 6 NO, '홍길순' NAME, '1981-05' B,  70 W FROM DUAL UNION ALL
SELECT 7 NO, '홍길순' NAME, '1981-05' B,  70 W FROM DUAL UNION ALL
SELECT 8 NO, '홍길순' NAME, '1981-05' B,  65 W FROM DUAL
)
SELECT TO_NUMBER(SUBSTR(BWNO, -3)) NO, NAME, SUBSTR(BWNO, 1, 7) B, TO_NUMBER(SUBSTR(BWNO, 9, 3)) W
  FROM (
        SELECT NAME, MIN(B||'^'||WNO) BWNO 
          FROM (
                SELECT NAME, B, MAX(LPAD(W, 3, '0')||'^'||LPAD(NO, 3, '0')) WNO  
                  FROM AAA
                 GROUP BY NAME, B
               )
         GROUP BY NAME
       )
;

 


by 초슈꽃 [2014.08.29 09:31:24]

덕분에 한수 배우고 갑니다.

고맙습니다 ^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입