5. 자주 하는 실수 (Tip)
실수 1: MSSQL PIVOT 에 원본 테이블을 그대로 넘긴다
MSSQL 의 PIVOT 은 FOR 컬럼과 집계 컬럼을 뺀 나머지 모든 컬럼으로 묶어서 집계합니다. orders 를 바로 넘기면 id 도 묶는 기준이 되어 행이 사원 4개가 아니라 주문 12개로 나옵니다.
-- MSSQL: 잘못된 예
SELECT *
FROM orders
PIVOT (SUM(amt) FOR qtr IN ([1], [2], [3], [4])) p;도식(H2 미지원, 실행 결과 아님). 앞 4행만 그렸고 실제로는 12행입니다.
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 행을 남깁니다.