<문제>
다음과 같이 테이블이 3개가 있습니다.
- 1. 스터디 학생 테이블은 s_id가 PK입니다.
- 2. 스터디 과목 테이블은 c_id가 PK입니다.
- 3. 스터디마스터테이블은 학생과 과목 테이블을 각각 참조하며 PK는 s_id, c_id, chasu 3개 항목의 조합입니다.
쿼리 작성 조건입니다.
- - 학생별로 2개행씩(스터티과목수만큼) 조회되어야 합니다.
- - 스터디 차수별로 가입여부에 '○'표로 표시합니다. 3차까지 표시.
- - 과목별 참여건수를 표시합니다.
- - 서브쿼리 없이 작성하세요.

<원본 TBL>

<postgreSQL사용하여 문제해결>
WITH student AS
(
SELECT '001'AS s_id, '기민용'AS s_nm
UNION ALL SELECT '002', '이현석'
UNION ALL SELECT '003', '김정식'
UNION ALL SELECT '004', '강정식'
)
, course AS
(
SELECT '001' AS c_id, 'Database'AS c_nm
UNION ALL SELECT '002', 'Java'
)
, study AS
(
SELECT '001'AS s_id, '001'AS c_id, 1 AS chasu
UNION ALL SELECT '001', '001', 3
UNION ALL SELECT '001', '002', 2
UNION ALL SELECT '002', '001', 1
UNION ALL SELECT '002', '001', 2
UNION ALL SELECT '002', '001', 3
UNION ALL SELECT '003', '002', 1
UNION ALL SELECT '003', '002', 2
UNION ALL SELECT '004', '001', 1
)
SELECT CASE WHEN B.C_ID='001' THEN A.S_ID END ID,
CASE WHEN B.C_ID='001' THEN A.S_NM END AS"NAME",
B.C_NM,
MIN(CASE WHEN C.CHASU=1 THEN '0' END)AS "1차",
MIN(CASE WHEN C.CHASU=2 THEN '0' END)AS "2차",
MIN(CASE WHEN C.CHASU=3 THEN '0' END)AS "3차",
COUNT(C.CHASU)
FROM STUDENT A CROSS JOIN COURSE B LEFT JOIN STUDY c
ON A.S_ID=C.S_ID AND B.C_ID=C.C_ID
GROUP BY B.C_ID,A.S_ID,A.S_NM,B.C_NM
ORDER BY A.S_ID

'DataBase > 구루비SQL Quiz' 카테고리의 다른 글
| [Oracle] 경우의 수 구하기 (0) | 2024.04.16 |
|---|---|
| [PostgreSQL]IP목록 정렬 (0) | 2023.09.21 |
| [PostgreSQL]연속된 날짜를 하나의 그룹으로 표현 (0) | 2023.09.21 |
| [PostgreSQL]분석함수 사용하지 않고 rank 쿼리 사용 (0) | 2023.08.28 |
| [Vertica]사원의 급여 합계 및 평균 (0) | 2023.08.28 |