안녕하세요.
구루비 사이트에 게시된
"퀴즈로 배우는 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 ;
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
또한, 여러 레코드에서 값이 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 )