group by를 어떻게 해야할지 모르겠어요. ㅜㅠ 0 2 1,696

by 조현정 [2011.04.26 16:24:22]


안녕하세요. 제가 원하는 결과가 다음과 같을때 group by를 어떻게 써야 할지 아이디어 기부 주세요..ㅠㅠ

<데이터>
C1   C2   C3   (컬럼)
--------------------------------
M1    0   NULL
M2    0   NULL
M2    1   BB
M2    1   CC


<원하는 결과>
M1    0   NULL
M2    1   BB
M2    1   CC

그러니까.. 데이터 두번째 레코드인  M2   0    NULL를 제거하고싶습니다.

HAVING ( C1  =  'M2'   AND   C2  >  0 )  이런 답은 사양합니당.....

C1에 어떤 값이 들어올지 알 수 없는 거라 하드코딩은 안되거든요.
C2에 0과 1만 들어올 수 있고요. (<= 요건 확실)
C3에 역시 어떤 값이 들어올지 미리 알 수는 없어요.

by 知音 [2011.04.26 16:58:05]
with t as (
select 'M1' c1, 0 c2, '' c3 from dual union all
select 'M2' , 0 , '' from dual union all
select 'M2' , 1 , 'BB' from dual union all
select 'M2' , 1 , 'CC' from dual
)
select c1, c2, c3
from (
select c1, c2, c3, count(*)over(partition by c1) rn
from t
)
where ( rn = 1 )
or ( rn > 1
and c3 is not null
)


by 마농 [2011.04.27 00:16:23]
문제를 풀기 위해선 왜 그래야만 하는지 당위성이 있어야 할텐데요.
질문 내용만 봐서는
왜? 2번째 행이 빠져야 하는지?
왜? Group By 를 써야 하는지?
질문이 부족하네요.

혹시 원하시는것이 c1을 기준으로 c2가 1인것만 조회하는데,
다만 c2가 1인 자료가 없을땐 0인자료가 조회되어야 한다? 뭐 이런건가요?
이게 맞다면 질문 잘하시는 법도 배우셔야 할듯 하네요.

SELECT c1, c2, c3
FROM
(
SELECT c1, c2, c3
, RANK() OVER(PARTITION BY c1 ORDER BY c2 DESC) rk
FROM t
)
WHERE rk = 1
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입