오라클 select시 0 4 626

by 구루구루구루 [SQL Query] [2019.03.18 11:37:30]


각 학생이 언어, 수학, 외국어, 기타부분의 강의를 몇개씩 수강하는지 쿼리를 짜려고합니다.

그래서 다음과 같이 쿼리를 짰고

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

 

by 이준환 [2019.03.18 13:16:08]


/*
-- 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")
)
;

 


by 마농 [2019.03.18 13:34:33]
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
;

 


by 우리집아찌 [2019.03.18 13:36:33]

DB도 명시해주세요.,


by 구루구루구루 [2019.03.19 13:16:11]

DB예시 추가했습니다!

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