더북(TheBook)
① 전통적인 방법 - 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문을 사용해 로우를 컬럼으로 변환하는 것은 가장 일반적인 방법으로, 가독성은 좋긴 하지만 메인 쿼리를 서브 쿼리로 만들어 집계를 해야 하며 코드가 길어지는 단점이 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.