DataBase/구루비SQL Quiz

[PostgreSQL]스터디가입현황

cororo2 2023. 8. 24. 16:49

<문제>

다음과 같이 테이블이 3개가 있습니다.

  • 1. 스터디 학생 테이블은 s_id가 PK입니다.
  • 2. 스터디 과목 테이블은 c_id가 PK입니다.
  • 3. 스터디마스터테이블은 학생과 과목 테이블을 각각 참조하며 PK는 s_id, c_id, chasu 3개 항목의 조합입니다.

쿼리 작성 조건입니다.

  • - 학생별로 2개행씩(스터티과목수만큼) 조회되어야 합니다.
  • - 스터디 차수별로 가입여부에 '○'표로 표시합니다. 3차까지 표시.
  • - 과목별 참여건수를 표시합니다.
  • - 서브쿼리 없이 작성하세요.

출처 :&nbsp;http://www.gurubee.net/lecture/2190

<원본 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