그룹별 조건에 맞는 데이터만 가져오기 0 7 1,417

by 통합문서 [SQL Query] [2016.07.25 16:33:02]


ID     USERID    TYPE

100    aaaa1        M

100    aaaa2        S

100    aaaa3        S

200    bbbb1       M

200    bbbb2       S

300    cccc1        S

위와같이 데이터가 있을경우,

ID별로 TYPE이 M이 우선이고 M이 없으면 S의 USERID값만 가져오고 싶은경우 어떡해야하나요?

그룹별 랭킹  row_number() over(partition by id order by type) 사용안하는 조건입니다...

결과

100    aaaa1        M

200    bbbb1       M

300    cccc1        S

by jkson [2016.07.25 16:49:02]

분석함수를 사용하면 안 된다는 말씀이신가요?

id = 300의 경우 S가 여러개이면 여러가 모두 출력하는 건가요?

 

단순히 row_number() over만 사용 안 하는 것이고 id별로 단 1건만 표현하는 것이라면

with t as
(
select '100' id,    'aaaa1' userid,       'M' type from dual union all
select '100' id,    'aaaa2' userid,       'S' type from dual union all
select '100' id,    'aaaa3' userid,       'S' type from dual union all
select '200' id,    'bbbb1' userid,       'M' type from dual union all
select '200' id,    'bbbb2' userid,       'S' type from dual union all
select '300' id,    'cccc1' userid,       'S' type from dual
)
select id, min(userid) keep (dense_rank first order by type) userid, min(type) type 
  from t
 group by id

이런 형태도 가능할 거 같은데요.

 

아니면 이렇게..

select * from t x
where type = 'M'
or not exists (select 1 from t y where y.id = x.id and type = 'M')

 

이렇게 하면 같은 id에 대해 M값이나 S값이 중복되어도 다 나오겠네요.

안나오게 하려면 group by id해주면 될 것 같구요.


by 통합문서 [2016.07.25 16:56:17]

네네 답변 감사합니다. S만 여러개 있는경우 1개만 출력해야합니다.

oracle, mssql 둘다 돌아가야해서 oracle dependancy 하면 안됩니다. ㅠ


by jkson [2016.07.25 16:58:51]

그러면 1개만 출력되는 조건은요?

제일 작은 값만 출력한다면

select id, min(userid) userid, type from t x
where type = 'M'
or not exists (select 1 from t y where y.id = x.id and type = 'M')
group by id, type

이렇게 하시면 될 것 같은데요.

퇴근합니다. 수고하세용~


by 마늘장아찌 [2016.07.25 17:07:57]

WITH t1 AS
(SELECT  100 ID, 'aaaa1' userid,        'M' div FROM dual UNION ALL
SELECT 100,    'aaaa2',        'S' FROM dual UNION ALL
SELECT 100,    'aaaa3',        'S' FROM dual UNION ALL
SELECT 200,    'bbbb1',       'M' FROM dual UNION ALL
SELECT 200,    'bbbb2',       'S' FROM dual UNION ALL
SELECT 300,    'cccc1',        'S' FROM dual)
SELECT ID, userid, div
FROM t1 b
WHERE (b.id, b.div) IN (SELECT ID 
                             ,min(div)
                         FROM t1 a
                        GROUP BY ID)
ORDER BY ID, userid


by 마농 [2016.07.25 17:09:19]

MSSQL 도 ROW_NUMBER 사용 가능합니다.


by 통합문서 [2016.07.25 17:43:13]

아 네네 표준함수였네요. 감사합니다.!!


by 마농 [2016.07.25 17:45:26]

표준 함수이긴 한데...

아직 지원 안하는 DB 가 있다는 건 함정(?)

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