Programming Language/SQL 문제풀이
[SQL 문제풀이] 4. SQL로 Pivot Table 구현
wakelight23
2024. 10. 17. 18:21
Pivot Table?
● 2개 이상의 기준으로 데이터를 집계할 때, 보기 쉽게 배열해서 나타내는 것
- 기본 구조
| 구분 칼럼 | |
| 집계 기준 | 데이터 |
- 예시
집계기준 : 일자, 시간
| 1시 (구분 칼럼) | 2시 | 3시 | 4시 | |
| 10월 1일(집계 기준) | 4 (데이터) | 2 | 4 | 7 |
| 10월 2일 | 5 | 10 | 5 | 8 |
| 10월 3일 | 7 | 3 | 6 | 9 |
● 문제 : 음식점별 시간별 주문건수 Pivot Table 뷰 만들기
(조건 : 15~20시 사이, 20시 주문건수 기준 내림차순 정렬)
예시 TABEL 1 : 주문정보 / TABEL 2 : 계산정보
| 주문번호 | 음식점명 | 주문시간 | |
| 1 | 1001 | 식스맨 | 15:12 |
| 2 | 1002 | 피자리아 | 16:13 |
| 3 | 1003 | 스케스시 | 17:30 |
| 4 | 1004 | 단리향 | 18:20 |
| 5 | 1005 | 식스맨 | 16:36 |
| 6 | 1006 | 스케스시 | 19:20 |
| 7 | 1007 | 식스맨 | 20:30 |
| 8 | 1008 | 식스맨 | 15:44 |
1. 음식점별, 시간별 주문건수 집계
|
SELECT a.음식점명,
SUBSTR(b.주문시간, 1, 2) hh, COUNT(1) cnt_order FROM 주문정보 a INNER JOIN 계산정보 b ON a.주문번호=b.주문번호 WHERE SUBSTR(b.주문시간, 1, 2) BETWEEN 15 and 20 GROUP BY 1, 2 |
- 우선 음식점명, 주문시간, 주문건수를 집계할 SubQuery문 작성
- SUBSTR로 '분'은 없애고 '시'만 남기기
- WHERE 절로 15시에서 20시 사이만 조회
-결과물
| 음식점명 | 주문시간 | cnt_order | |
| 1 | 식스맨 | 15 | 2 |
| 2 | 피자리아 | 16 | 1 |
| 3 | 스케스시 | 17 | 1 |
| 4 | 단리향 | 18 | 1 |
| 5 | 식스맨 | 16 | 1 |
| 6 | 스케스시 | 19 | 1 |
| 7 | 식스맨 | 20 | 1 |
2. Pivot view 구조 만들기
|
SELECT 음식점명,
MAX(IF(hh='15', cnt_order, 0)) "15", MAX(IF(hh='16', cnt_order, 0)) "16", MAX(IF(hh='17', cnt_order, 0)) "17", MAX(IF(hh='18', cnt_order, 0)) "18", MAX(IF(hh='19', cnt_order, 0)) "19", MAX(IF(hh='20', cnt_order, 0)) "20" FROM ( SELECT a.음식점명, SUBSTR(b.주문시간 1, 2) hh, COUNT(1) cnt_order FROM 주문정보 a INNER JOIN 계산정보 b on a.주문번호=b.주문번호 WHERE SUBSTR(b.주문시간, 1, 2) BETWEEN 15 and 20 GROUP bY 1, 2 ) a GROUP BY 1 ORDER BY 7 DESC |
- 음식점별 시간별로 분류된 값의 최대값을 Pivot Table에 작성
- SubQuery로 필요한 정보 정리
- 음식점명 기준으로 조회
- 20시 기준으로 ORDER BY 7(7번째 칼럼) DESC 로 내림차순 정렬
-결과물
| 음식점명 | 15 | 16 | 17 | 18 | 19 | 20 | |
| 1 | 식스맨 | 2 | 1 | 0 | 0 | 0 | 1 |
| 2 | 피자리아 | 0 | 1 | 0 | 0 | 0 | 0 |
| 3 | 스케스시 | 0 | 0 | 1 | 0 | 1 | 0 |
| 4 | 단리향 | 0 | 0 | 0 | 1 | 0 | 0 |