각 학생이 언어, 수학, 외국어, 기타부분의 강의를 몇개씩 수강하는지 쿼리를 짜려고합니다.
그래서 다음과 같이 쿼리를 짰고
SELECT ID, NAME, CASE WHEN SUB LIKE 'A%' THEN '언어' WHEN SUB LIKE 'B%' THEN '수학', WHEN SUB LIKE 'C%' THEN '외국어' ELSE '기타과목' END "과목", COUNT(*)
FROM STUDENT
GROUP BY ID, NAME, CASE WHEN SUB LIKE 'A%' THEN '언어' WHEN SUB LIKE 'B%' THEN '수학', WHEN SUB LIKE 'C%' THEN '외국어' ELSE '기타과목' END
아이디 | 이름 | 과목 | 개수 |
1111 | 홍길동 | 언어 | 2 |
1111 | 홍길동 | 수학 | 3 |
이런식으로 결과 값이 나왔는데
아이디 | 이름 | 언어 | 수학 | 외국어 | 기타 |
1111 | 홍길동 | 2 | 3 | 0 | 1 |
2222 | 홍길순 | 1 | 1 | 1 | 2 |
이런식으로 한명의 값을 한 로우에 담고싶을때는 어떻게 쿼리를 짜야할까요..?ㅠㅠㅠ
※ DB예시
아이디 | 이름 | 과목코드 |
1111 | 홍길동 | A01 |
1111 | 홍길동 | A02 |
1111 | 홍길동 | B03 |
2222 | 홍길순 | A01 |
/* -- COUNT(DECODE()) 2019.03.18, Jun H. Lee */ WITH T(ID, NM, SBJ) AS ( SELECT '1111', '홍길동', '언어' FROM DUAL UNION ALL SELECT '1111', '홍길동', '언어' FROM DUAL UNION ALL SELECT '1111', '홍길동', '수학' FROM DUAL UNION ALL SELECT '1111', '홍길동', '수학' FROM DUAL UNION ALL SELECT '1111', '홍길동', '수학' FROM DUAL UNION ALL SELECT '2222', '나학생', '언어' FROM DUAL UNION ALL SELECT '2222', '나학생', '언어' FROM DUAL UNION ALL SELECT '2222', '나학생', '언어' FROM DUAL UNION ALL SELECT '2222', '나학생', '수학' FROM DUAL UNION ALL SELECT '2222', '나학생', '수학' FROM DUAL ) SELECT ID , MAX(NM) AS NM , COUNT(DECODE(SBJ, '언어', 1)) AS LANG_CNT , COUNT(DECODE(SBJ, '수학', 1)) AS MATH_CNT FROM T GROUP BY ID ; /* -- PIVOT_CLAUSE 2019.03.18, Jun H. Lee */ WITH T(ID, NM, SBJ) AS ( SELECT '1111', '홍길동', '언어' FROM DUAL UNION ALL SELECT '1111', '홍길동', '언어' FROM DUAL UNION ALL SELECT '1111', '홍길동', '수학' FROM DUAL UNION ALL SELECT '1111', '홍길동', '수학' FROM DUAL UNION ALL SELECT '1111', '홍길동', '수학' FROM DUAL UNION ALL SELECT '2222', '나학생', '언어' FROM DUAL UNION ALL SELECT '2222', '나학생', '언어' FROM DUAL UNION ALL SELECT '2222', '나학생', '언어' FROM DUAL UNION ALL SELECT '2222', '나학생', '수학' FROM DUAL UNION ALL SELECT '2222', '나학생', '수학' FROM DUAL ) SELECT * FROM ( SELECT ID , MAX(NM) AS NM , SBJ , COUNT(*) AS CNT FROM T GROUP BY ID, SBJ ) PIVOT ( SUM(CNT) AS CNT FOR SBJ IN ('언어' AS "LANG", '수학' AS "MATH") ) ;
WITH t AS ( SELECT 1111 id, '홍길동' name, 'A01' sub FROM dual UNION ALL SELECT 1111, '홍길동', 'A02' FROM dual UNION ALL SELECT 1111, '홍길동', 'B01' FROM dual UNION ALL SELECT 1111, '홍길동', 'B02' FROM dual UNION ALL SELECT 1111, '홍길동', 'B03' FROM dual UNION ALL SELECT 1111, '홍길동', 'D01' FROM dual ) SELECT id, name , COUNT(DECODE(SUBSTR(sub, 1, 1), 'A', 1)) 언어 , COUNT(DECODE(SUBSTR(sub, 1, 1), 'B', 1)) 수학 , COUNT(DECODE(SUBSTR(sub, 1, 1), 'C', 1)) 외국어 , COUNT(CASE WHEN SUBSTR(sub, 1, 1) NOT IN ('A', 'B', 'C') THEN 1 END) 기타 FROM t GROUP BY id, name ;