(재질문)데이터 부분합치는것에 대해서 도움좀 구합니다. 0 7 2,366

by 프리어 [2012.12.07 15:40:42]




사번  이름  지역  나이   전화번호
-------------------------------------------------------------
101  홍길동  서울   30 
101  홍길동  서울    _    010-1234-5678
102  김철수  대전   26   010-321-7654
102  김철수  대전   26   010-765-1532
102  김철수  대전   26   010-934-2356
103  이영희  부산   _ 010-1234-5678
103  이영희  부산   24 



사번  이름  지역  나이  전화번호
--------------------------------------------------
101  홍길동  서울  30  010-1234-5678
102  김철수  대전  26  010-321-7654
102  김철수  대전  26  010-765-1532
102  김철수  대전  26  010-934-2356
103  이영희  부산  24  010-1234-5678


질문내용이 부족해서 다시 질문드립니다. DATA를 아래의 결과로 조회하고싶습니다.
어떻게 조회하는게 좋을까요?
언더라인(_)은 공백이 안들어가서 넣은것입니다.

by 마농 [2012.12.07 15:48:02]

설명이 별도로 없어서 다시 한번 확인질문 들어갑니다.
지금 보여주시는 자료가 모든 자료를 대변하는 자료 맞지요? 다른 경우는 없는 거지요?
그렇다면... 제가 자료에 대한 설명을 보태보면
나이만 있는 자료와 전화번호만 있는 자료가 쌍으로 있어서 두 자료를 하나로 합쳐서 보여주고 싶다?
맞나요?
혹시 쌍으로 있지 않고 나이만 있거나 전화번호만 하나 있는 경우나?
1: 2 또는 2:1 로 짝이 맞지 않는 경우? 등은 없는 거 확실하지요?
질문 설명이 부실하면 예시자료라도 확실해야 합니다.


by 까망소 [2012.12.07 15:54:19]
억지스럽게... 한 번 해봤습니다. ㅋ
with t as 
(
select '101' as no, '홍길동' as name, '서울' as loc, '30' as age, ''        as telno from dual union all
select '101' as no, '홍길동' as name, '서울' as loc, ''  as age, '010-1234-5678' as telno from dual union all
select '102' as no, '김철수' as name, '대전' as loc, '26' as age, '010-321-7654'  as telno from dual union all
select '102' as no, '김철수' as name, '대전' as loc, '26' as age, '010-765-1532'  as telno from dual union all
select '102' as no, '김철수' as name, '대전' as loc, '26' as age, '010-934-2356'  as telno from dual union all
select '103' as no, '이영희' as name, '부산' as loc, ''  as age, '010-1234-5678' as telno from dual union all
select '103' as no, '이영희' as name, '부산' as loc, '24' as age, ''        as telno from dual
)
select no, name, loc, age, telno
 from (
    select no, name, loc, max(age) as age, max(telno) as telno 
     from t
     where age is null or telno is null
    group by no, name, loc
    union all
    select no, name, loc, age, telno 
     from t
     where not (age is null or telno is null)
    )
order by 1

by 신이만든짝퉁 [2012.12.07 16:17:19]
데이터가 위에 제시한 형태만 있다면
예전에 마농님이 말씀하신 것을 조금만 변형하여 사용하시면 되겠네요.

SELECT 사번, 이름, 지역, max(나이), max(전화번호)
  FROM 테이블
 WHERE 나이 IS NULL OR 전화번호 IS NULL
 GROUP BY 사번, 이름, 지역
UNION ALL
SELECT 사번, 이름, 지역, 나이, 전화번호
  FROM 테이블
 WHERE 나이 IS NOT NULL AND 전화번호 IS NOT NULL
;

by 신이만든짝퉁 [2012.12.07 16:18:26]
 어라? 까망소님과 같은 쿼리네요? ^^;

by 신이만든짝퉁 [2012.12.07 16:28:12]
 
SELECT a.사번, a.이름, a.지역, a.나이, b.전화번호
  FROM (  -- 사번, 이름, 지역이 같으면서 나이가 다른 사람은 없다고 가정
        SELECT 사번, 이름, 지역, max(나이) 나이
          FROM 테이블
         GROUP BY 사번, 이름, 지역
        ) a
      , (
        SELECT 사번, 이름, 지역, 전화번호
          FROM 테이블
         WHERE 전화번호 IS NOT NULL
        ) b
 WHERE a.사번 = b.사번
   AND a.이름 = b.이름
   AND a.지역 = b.지역
;

경우가 좀 더 다양할 때를 가정한 쿼리문입니다.

by 프리어 [2012.12.10 11:25:32]

//마농님 죄송합니다.
다시 설명 덧붙이자면 사번, 이름, 지역까지는 같은 사번에 대해서 동일한 데이터가 들어갑니다.
다만 나이나 전화번호에 대해서는 저런식으로 한쌍의 데이터가 있습니다.

제가 난감하다고 생각하는게 사번이 102같은 데이터가 존재해서 max함수를 써서 할수도 없고 해서 이렇게 질문드립니다.

by 프리어 [2012.12.10 11:26:07]
 //신이만든짝퉁 님 답변 감사합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입