SQL - SQL로 PIVOT 테이블 만들기

2023. 8. 14. 15:02DATA PROGRAMMING/SQL

피벗은 원시 데이터의 테이블을 통해 통계 요약 테이블을 만드는 방법이다. Oracle에서는 PIVOT() 함수를 통해서 쉽게 통계요약 테이블을 만들수 있지만 표준 SQL의 기능만으로도 충분히 만들수 있다.

 

문제

 

코드

-- 코드를 입력하세요
SELECT o.city,
    COALESCE(SUM(CASE MONTH(p.paymentDate) WHEN 1 THEN 1 END), 0) '1월',
    COALESCE(SUM(CASE MONTH(p.paymentDate) WHEN 2 THEN 1 END), 0) '2월',
    COALESCE(SUM(CASE MONTH(p.paymentDate) WHEN 3 THEN 1 END), 0) '3월',
    COALESCE(SUM(CASE MONTH(p.paymentDate) WHEN 4 THEN 1 END), 0) '4월',
    COALESCE(SUM(CASE MONTH(p.paymentDate) WHEN 5 THEN 1 END), 0) '5월',
    COALESCE(SUM(CASE MONTH(p.paymentDate) WHEN 6 THEN 1 END), 0) '6월',
    COALESCE(SUM(CASE MONTH(p.paymentDate) WHEN 7 THEN 1 END), 0) '7월',
    COALESCE(SUM(CASE MONTH(p.paymentDate) WHEN 8 THEN 1 END), 0) '8월',
    COALESCE(SUM(CASE MONTH(p.paymentDate) WHEN 9 THEN 1 END), 0) '9월',
    COALESCE(SUM(CASE MONTH(p.paymentDate) WHEN 10 THEN 1 END), 0) '10월',
    COALESCE(SUM(CASE MONTH(p.paymentDate) WHEN 11 THEN 1 END), 0) '11월',
    COALESCE(SUM(CASE MONTH(p.paymentDate) WHEN 12 THEN 1 END), 0) '12월',
    COUNT(p.checkNo) '결재횟수'
FROM s_offices o LEFT JOIN s_employees e USING (officeCode)
    LEFT JOIN s_customers c ON e.employeeId = c.salesRepId
    LEFT JOIN s_payments p USING (customerId)
WHERE YEAR(p.paymentDate) = 2004
GROUP BY o.city
ORDER BY o.city ;

우선 테이블의 내용들을 채우기 위해 CASE 함수를 사용하여 paymentDate의 월이 1~12인 데이터들을 각각 만들어 주고 그 값들의 횟수를 SUM()함수를 통해 만들어 준다. 보기 편하게 만들기 위해서 NULL값들은 모두 0으로 처리해 주는게 좋다. 이 역할은 CALESCE 함수를 활용하였다.

또한 조인을 통해 떨어져있는 offices 테이블을 payments 테이블에 연결해준 이후 city를 기준을 GROUP BY 해주면 된다.

 

 

결과