홈 › SQL 고급 › 05 / 10

행과 열 바꾸기

PIVOT, UNPIVOT, 조건부 집계
섹션 6진행 0 / 10

5. 자주 하는 실수 (Tip)

실수 1: MSSQL PIVOT 에 원본 테이블을 그대로 넘긴다

MSSQL 의 PIVOT 은 FOR 컬럼과 집계 컬럼을 뺀 나머지 모든 컬럼으로 묶어서 집계합니다. orders 를 바로 넘기면 id 도 묶는 기준이 되어 행이 사원 4개가 아니라 주문 12개로 나옵니다.

sql
-- MSSQL: 잘못된 예
SELECT *
  FROM orders
 PIVOT (SUM(amt) FOR qtr IN ([1], [2], [3], [4])) p;

도식(H2 미지원, 실행 결과 아님). 앞 4행만 그렸고 실제로는 12행입니다.

text
id | emp    | 1    | 2    | 3    | 4
---+--------+------+------+------+-----
1  | 강민호 | 100  | NULL | NULL | NULL
2  | 강민호 | NULL | 120  | NULL | NULL
3  | 강민호 | NULL | NULL | 90   | NULL
4  | 강민호 | NULL | NULL | NULL | 150

필요한 컬럼(emp, qtr, amt)만 고른 파생 테이블을 넘기면 됩니다. 예제 5 가 그 형태입니다. 조건부 집계는 GROUP BY 로 묶는 기준을 직접 적으므로 이 함정이 없습니다.

실수 2: UNPIVOT 에서 NULL 행이 사라진 걸 모른다

UNPIVOT 결과에서 빈 칸이 사라지므로 "실적 없음" 을 세는 집계가 틀어집니다. 사원별 행 수로 평균을 내면 4로 나눠야 할 것을 실제 있는 칸 수로 나누는 셈입니다. Oracle 은 INCLUDE NULLS, MSSQL 은 CROSS APPLY (VALUES ...) 로 NULL 행을 남깁니다.