group by 사용시 MIN() 사용 문의 1 4 2,444

by create [Oracle 기초] group by min [2016.01.22 10:28:24]


안녕하세요.

구루비 사이트에 게시된
"퀴즈로 배우는 SQL"  메뉴의
"[퀴즈] 스터디 가입현황을 보여주는 쿼리를 작성하는 문제입니다." 를
( http://www.gurubee.net/lecture/2190 ) 
수행하면서 느낀점입니다. (오라클, oracle 환경)

해당 쿼리에서 group by 를 하여 MIN() 함수를 사용하여 
각 차수 1차 일 경우 'O' 이라는 표시를 하려는건 알겠는데, 
MIN() 으로만 함수를 사용했는데,  MAX() 함수를 써도 같은 결과가 되기는 하더라구요
이런상황에서는 MIN(), 이나 혹은 MAX() 함수를 둘중 아무거나 써도 상관없는걸까요?
만약 MIN() 로만 써야한다면 그 이유는 무엇인지
의문이 들어 이렇게 글을 남깁니다.

아래가 샘플 쿼리문입니다.


WITH student AS
(
    SELECT '001' s_id, '기민용' s_nm FROM dual
    UNION ALL SELECT '002', '이현석' FROM dual
    UNION ALL SELECT '003', '김정식' FROM dual
    UNION ALL SELECT '004', '강정식' FROM dual
)
, course AS
(
    SELECT '001' c_id, 'Database' c_nm FROM dual
    UNION ALL SELECT '002', 'Java' FROM dual
)
, study AS
(
    SELECT '001' s_id, '001' c_id, 1 chasu FROM dual
    UNION ALL SELECT '001', '001', 3 FROM dual
    UNION ALL SELECT '001', '002', 2 FROM dual
    UNION ALL SELECT '002', '001', 1 FROM dual
    UNION ALL SELECT '002', '001', 2 FROM dual
    UNION ALL SELECT '002', '001', 3 FROM dual
    UNION ALL SELECT '003', '002', 1 FROM dual
    UNION ALL SELECT '003', '002', 2 FROM dual
    UNION ALL SELECT '004', '001', 1 FROM dual
)

select st.s_id
     , st.s_nm
     , cs.c_id
     , cs.c_nm
     , MAX(CASE WHEN sd.chasu = 1 THEN 'O' END ) as "1차"
     , MIN(CASE WHEN sd.chasu = 2 THEN 'O' END ) as "2차"
     , MIN(CASE WHEN sd.chasu = 3 THEN 'O' END ) as "3차"
     , count(sd.s_id) as "참여횟수"
from study  sd
   , student st
   , course  cs
where sd.s_id = st.s_id
  and sd.c_id = cs.c_id
group by st.s_id
     , st.s_nm
     , cs.c_id
     , cs.c_nm
order by st.s_id, cs.c_id
;
by 아발란체 [2016.01.22 10:48:31]

1건 이상 레코드에서

다 값이 없거나 1건만 값이 있기 때문에

합쳐서 있는 값 1개만 가지고 오는 것이기 때문에

MIN 쓰나, MAX 쓰나 값이 있는 1건만 가지고 오기 때문에 결과가 동일합니다.

즉 이런 경우 MIN 또는 MAX를 쓰는 기준 없습니다. 아무거나 쓰시면 됩니다.

 

그룹바이 절을 제거하고 아래를 실행하면 그룹바이 기준 값으로 1건씩만 값이 있습니다.

select st.s_id
     , st.s_nm
     , cs.c_id
     , cs.c_nm
     , (CASE WHEN sd.chasu = 1 THEN 'O' END ) as "1차"
     , (CASE WHEN sd.chasu = 2 THEN 'O' END ) as "2차"
     , (CASE WHEN sd.chasu = 3 THEN 'O' END ) as "3차"
from study  sd
   , student st
   , course  cs
where sd.s_id = st.s_id
  and sd.c_id = cs.c_id
order by st.s_id, cs.c_id

 


by create [2016.01.25 11:06:05]

감사합니다.

덕분에 명확하게 이해가 되었습니다 ~^O^


by 아발란체 [2016.01.22 10:54:19]

또한, 여러 레코드에서 값이 1건이 아닌 여러건이 뜨는 경우,

NULL, NULL, NULL, 0, NULL, 0 

NULL 아님 O만 뜨기 때문에 MAX뜨나 MIN 쓰나 역시 0이 뜹니다.

SELECT MAX(DD), MIN(DD) FROM (
  SELECT NULL DD FROM DUAL
  UNION ALL SELECT NULL FROM DUAL
  UNION ALL SELECT NULL FROM DUAL
  UNION ALL SELECT 0 FROM DUAL
  UNION ALL SELECT NULL FROM DUAL
  UNION ALL SELECT 0 FROM DUAL
)

 


by 타이니스타 [2016.01.22 15:14:47]

아발란체님 말씀대로 MIN 함수나 MAX 함수 어느걸 써도 상관없습니다.

group by 에 명시한 컬럼 외의 select 에서 명시하는 각 컬럼들은 그룹함수로 묶어줘야 하는데요.

결과값이 단일행이므로 단일행에 대하여 최소값이나 최대값을 구하는 함수 중  무엇을 쓰더라도 결과값이 같으므로 아무거나 쓰셔도 됩니다.

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