① 전통적인 방법 - DECODE 혹은 CASE
가장 일반적이고 전통적인 방법은 DECODE나 CASE를 사용하는 것이다. 밑으로 쭉 늘어져 있는 국어, 영어, 수학 등의 과목을 옆으로 펼치려면 subjects 컬럼 값을 다음과 같이 DECODE나 CASE를 사용해 체크하는 로직을 심어야 한다.
입력
SELECT years,
gubun,
CASE WHEN subjects = '국어' THEN score ELSE 0 END "국어",
CASE WHEN subjects = '영어' THEN score ELSE 0 END "영어",
CASE WHEN subjects = '수학' THEN score ELSE 0 END "수학",
CASE WHEN subjects = '과학' THEN score ELSE 0 END "과학",
CASE WHEN subjects = '지리' THEN score ELSE 0 END "지리",
CASE WHEN subjects = '독일어' THEN score ELSE 0 END "독일어"
FROM ch14_score_table a;
결과
YEARS GUBUN 국어 영어 수학 과학 지리 독일어
------- --------- ---------- ---------- ---------- ---------- ---------- ----------
2014 중간고사 92 0 0 0 0 0
2014 중간고사 0 87 0 0 0 0
2014 중간고사 0 0 67 0 0 0
2014 중간고사 0 0 0 80 0 0
2014 중간고사 0 0 0 0 93 0
2014 중간고사 0 0 0 0 0 82
2014 기말고사 88 0 0 0 0 0
2014 기말고사 0 80 0 0 0 0
2014 기말고사 0 0 93 0 0 0
2014 기말고사 0 0 0 91 0 0
2014 기말고사 0 0 0 0 89 0
2014 기말고사 0 0 0 0 00 83
로우가 컬럼으로 변환되긴 했지만 점수가 이가 빠진 것처럼 출력되었다. 따라서 제대로 나오게 하려면 year, gubun 컬럼 값을 기준으로 집계해야 한다.
입력
SELECT years, gubun,
SUM(국어) AS 국어, SUM(영어) AS 영어, SUM(수학) AS 수학,
SUM(과학) AS 과학, SUM(지리) AS 지리, SUM(독일어) AS 독일어
FROM (
SELECT years, gubun,
CASE WHEN subjects = '국어' THEN score ELSE 0 END "국어",
CASE WHEN subjects = '영어' THEN score ELSE 0 END "영어",
CASE WHEN subjects = '수학' THEN score ELSE 0 END "수학",
CASE WHEN subjects = '과학' THEN score ELSE 0 END "과학",
CASE WHEN subjects = '지리' THEN score ELSE 0 END "지리",
CASE WHEN subjects = '독일어' THEN score ELSE 0 END "독일어"
FROM ch14_score_table a
)
GROUP BY years, gubun;
결과
YEARS GUBUN 국어 영어 수학 과학 지리 독일어
----- -------- -------- ------- ------ ------ ------ ----------
2014 기말고사 88 80 93 91 89 83
2014 중간고사 92 87 67 80 93 82
원하던 결과가 나왔다. 위 예제에서는 CASE문을 썼지만 DECODE문을 써도 동일한 결과를 얻을 수 있다. DECODE나 CASE문을 사용해 로우를 컬럼으로 변환하는 것은 가장 일반적인 방법으로, 가독성은 좋긴 하지만 메인 쿼리를 서브 쿼리로 만들어 집계를 해야 하며 코드가 길어지는 단점이 있다.