SQL - SQL로 PIVOT 테이블 만들기
2023. 8. 14. 15:02ㆍDATA 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 해주면 된다.
결과
'DATA PROGRAMMING > SQL' 카테고리의 다른 글
[SQL] GROUP BY와 집계 함수를 사용할 때 주의할 점 (0) | 2023.08.25 |
---|---|
[SQL] GROUP BY, HVING 절 간단한 응용 (0) | 2023.08.24 |
SQL - CTE를 이용해 Date Series 만들기 (0) | 2023.08.12 |
재귀 조인의 사용 (0) | 2023.08.12 |
SQL 관계 대수식 작성 연습 (0) | 2023.07.11 |