[GROPU BY 행 -> 열] 질문드립니다. 0 2 573

by 부산광어 [2020.06.08 16:59:11]


2010.10 (1).png (51,852Bytes)

출처 : 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를 각각 비교하고, 따로 나타내었다는 부분이 이해가 잘 되지 않고 혼란스럽습니다. 이 부분은 어떻게 이해하면 좋을까요?

by 마농 [2020.06.08 17:37:46]

이해가 잘 안 갈 때 는
 - 단계별 실행, 부분 실행 등으로 중간 결과를 확인해 보세요.
 - group by 와 max 등의 집계를 하기 전 상태까지만 조회해 보세요.(Decode 까지만 수행한 결과)
http://gurubee.net/lecture/2190


by 부산광어 [2020.06.08 18:57:39]

감사합니다. 막상 질문 드릴 때는 해보다 해보다 도저히 몰라서 질문드리는데,

마농님께서 주신 자료를 읽고, 차근차근히 하다보면 답이 도출되는 것 같고, 

이런 걸로 질문했나 싶을 정도로 부끄럽습니다..

그럼에도 불구하고, 매번 좋은 답변 주셔서 감사합니다. 

 

GROUP BY 절의 SELECT 문에서 DECODE, CASE WHEN + MAX, MIN 을 사용하면, 특정 컬럼의 값을 충분히 표시할 수 있군요.. 아직 서툴지만 좀 더 연습해보겠습니다 

 

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