[퀴즈] 날짜별 모든 코드에 대한 자료 채우기
코드테이블에는 3가지 코드값이 들어 있습니다.
이력테이블에는 일자별 코드에 해당하는 값이 저장되어 있습니다.
3개 코드가 모두 입력되는 날도 있지만 일부 코드만 입력되는 날도 있습니다.
일자별 코드별 코드명과 합계가 출력되는 쿼리를 작성하세요.
일부 코드만 입력된 날짜도 3개 코드가 모두 나와야 합니다.
일자별 소계도 함께 출력하세요.
CODE 테이블 | DATA 테이블 | 결과 테이블 | |||||||
CD | NM | DT | CD | V | DT | NM | V | ||
1 | PC | 20111201 | 1 | 10 | 20111201 | PC | 10 | ||
2 | Monitor | 20111201 | 2 | 20 | 20111201 | Monitor | 63 | ||
3 | NoteBook | 20111201 | 2 | 21 | 20111201 | NoteBook | 30 | ||
20111201 | 2 | 22 | 20111201 | 소계 | 103 | ||||
20111201 | 3 | 30 | 20111202 | PC | 10 | ||||
20111202 | 1 | 10 | 20111202 | Monitor | 0 | ||||
20111202 | 3 | 30 | 20111202 | NoteBook | 30 | ||||
20111204 | 1 | 10 | 20111202 | 소계 | 40 | ||||
20111204 | 2 | 40 | 20111204 | PC | 10 | ||||
20111205 | 3 | 50 | 20111204 | Monitor | 40 | ||||
20111204 | NoteBook | 0 | |||||||
20111204 | 소계 | 50 | |||||||
20111205 | PC | 0 | |||||||
20111205 | Monitor | 0 | |||||||
20111205 | NoteBook | 50 | |||||||
20111205 | 소계 | 50 |
다음은 원본 테이블 자료입니다.
WITH code AS
(
SELECT 1 cd, 'PC' nm FROM dual
UNION ALL SELECT 2, 'Monitor' FROM dual
UNION ALL SELECT 3, 'NoteBook' FROM dual
)
, data AS
(
SELECT '20111201' dt, 1 cd, 10 v FROM dual
UNION ALL SELECT '20111201', 2, 20 FROM dual
UNION ALL SELECT '20111201', 2, 21 FROM dual
UNION ALL SELECT '20111201', 2, 22 FROM dual
UNION ALL SELECT '20111201', 3, 30 FROM dual
UNION ALL SELECT '20111202', 1, 10 FROM dual
UNION ALL SELECT '20111202', 3, 30 FROM dual
UNION ALL SELECT '20111204', 1, 10 FROM dual
UNION ALL SELECT '20111204', 2, 40 FROM dual
UNION ALL SELECT '20111205', 3, 50 FROM dual
)
[정답보기] <=== 트리플클릭
SELECT d.dt
, NVL(c.nm, '소계') nm
, NVL(SUM(d.v), 0) v
FROM code c
LEFT OUTER JOIN data d
PARTITION BY (d.dt)
ON c.cd = d.cd
GROUP BY d.dt, ROLLUP((c.cd, c.nm))
;