출처 : http://gurubee.net/article/50641
아래의 <표 1>의 3개 테이블을 이용해 <표 2>와 같은 결과를 도출하는 쿼리를 작성해 보세요. 쿼리 작성조건입니다. - 학생별로 2개 행씩(스터디 과목 수만큼) 조회돼야 합니다. - ID와 성명은 2행중 첫 번째 행만 출력합니다. - 스터디 차수별로 가입여부에‘○’표로 표시합니다. 3차까지 표시. - 과목별 참여건수를 표시합니다. - 서브쿼리 없이 작성하세요. 아래 with절을 이용해 작성하세요. 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 c.s_id, c.s_nm, c.c_nm, max(decode(d.chasu,1,'O',' ')), max(decode(d.chasu,2,'O',' ')), max(decode(d.chasu,3,'O',' ')), count(d.chasu) FROM ( SELECT a.s_id, a.s_nm, b.c_id, b.c_nm FROM student a, course b )c, study d WHERE c.s_id = d.s_id (+) AND c.c_id = d.c_id (+) GROUP BY c.s_id, c.s_nm, c.c_nm ORDER BY 1;
제가 짠 쿼리문입니다.
여기서 질문이 하나 있습니다.
max(decode(d.chasu,1,'O',' ')) //d.chasu 1인 경우
max(decode(d.chasu,2,'O',' ')) //d.chasu 2인 경우
max(decode(d.chasu,3'O',' ')) //d.chasu 3인 경우
GROUP BY 컬럼 : 컬럼으로 묶어서 하나의 행으로 나타내는 것으로 알고 있습니다.
이런 경우에 SELECT 절에는 GROUP BY 절에 적힌 컬럼, 집계 함수 밖에 사용하지 못하는 것으로 알고 있구요.
그래서 같은 그룹으로 묶인 여러 행의 d.chasu를 각각 비교하고, 따로 나타내었다는 부분이 이해가 잘 되지 않고 혼란스럽습니다. 이 부분은 어떻게 이해하면 좋을까요?
이해가 잘 안 갈 때 는
- 단계별 실행, 부분 실행 등으로 중간 결과를 확인해 보세요.
- group by 와 max 등의 집계를 하기 전 상태까지만 조회해 보세요.(Decode 까지만 수행한 결과)
http://gurubee.net/lecture/2190