고수님 안녕하세요.
현재 Delphi5와 Interbase6을 사용하고 있습니다.
제가 이번에 맡고 있는 Project에 관하여 고수님께 몇가지 여쭤보고 싶어 이렇게
글을 뛰웁니다.
저의 짧은 지식으로 여쭙는 것이니 너그러이 봐 주셨으면 합니다.
현재 고민중인 Table에 관한 것인데...
Table의 구조가 다음과 같습니다.
CREATE TABLE T31 (
YYYY VARCHAR(4) not null, // 년도(Key)
BCOD VARCHAR(7) not null, // 거래선코드(Key)
MCOD VARCHAR(7) not null, // 상품코드(Key)
MA01 DOUBLE PRECISION Default 0, // 1월 판매금액
MQ01 DOUBLE PRECISION Default 0, // 판매수량
MA02 DOUBLE PRECISION Default 0, // 2월 판매금액
MQ02 DOUBLE PRECISION Default 0, // 판매수량
MA03 DOUBLE PRECISION Default 0, // 3월 판매금액
MQ03 DOUBLE PRECISION Default 0, // 판매수량
MA04 DOUBLE PRECISION Default 0, // 4월 판매금액
MQ04 DOUBLE PRECISION Default 0, // 판매수량
MA05 DOUBLE PRECISION Default 0, // 5월 판매금액
MQ05 DOUBLE PRECISION Default 0, // 판매수량
MA06 DOUBLE PRECISION Default 0, // 6월 판매금액
MQ06 DOUBLE PRECISION Default 0, // 판매수량
MA07 DOUBLE PRECISION Default 0, // 7월 판매금액
MQ07 DOUBLE PRECISION Default 0, // 판매수량
MA08 DOUBLE PRECISION Default 0, // 8월 판매금액
MQ08 DOUBLE PRECISION Default 0, // 판매수량
MA09 DOUBLE PRECISION Default 0, // 9월 판매금액
MQ09 DOUBLE PRECISION Default 0, // 판매수량
MA10 DOUBLE PRECISION Default 0, // 10월 판매금액
MQ10 DOUBLE PRECISION Default 0, // 판매수량
MA11 DOUBLE PRECISION Default 0, // 11월 판매금액
MQ11 DOUBLE PRECISION Default 0, // 판매수량
MA12 DOUBLE PRECISION Default 0, // 12월 판매금액
MQ12 DOUBLE PRECISION Default 0, // 판매수량
Constraint T31Key Primary Key (YYYY, BCOD, MCOD)
);
위의 구조와 같이 Table을 설계하여 각 년도와 월별 자료를 집계하고 산출해 낼려고
합니다. 하지만 위의 구조를 이용하여 각 월별로 전월과 대비하여 (%)로 그 대배를
산출해 낼려고 할때 적은 양의 Data가 있을경우는 각 Record별로 한건씩 Read하여
전월과 당월의 대비를 (%)로 산출해 내는데 어려움이 없으나 Data의 양이 엄청난 경우
많은 시간을 소비하게 되더군요.
전 그 산출 방법을 다음과 같이 이용하고 있습니다.
먼저 Query문을 이용하여 각 자료를 Group화 하여 자료를 생성합니다.
둘째로 만들어진 Query문을 while문을 이용하여 한건씩 Read하여 대비율을 산출하여
Work 용 Temp을 만들어 그 곳에 다시 저장합니다. (Temp 파일이죠...)
셋째 새로이 만들어진 Temp File을 일반 화면이나 Print 출력을 위한 용도로 활용
하고 있습니다.
하지만 위의 방법을 이용하는데 제약은 시간입니다. 데이타의 양이 너무나도 많아요
각 년도별로 거래처의 수가 약 25,000군데 이며 상품은 약 60,000가지가 넘어요
(5년) * (거래처:25,000군데) * (상품:60,000가지)
이를 Query문으로 모두 처리하고자 하면 제가 만든 Record를 로선 현재년도의 1월과
전년도 12월간의 자료를 동시에 읽을수가 없어 그 대비율을 낼수가 없어요.
고수님들 이런 경우 어떻게 해야 하나요?
Table설계를 다시해도 무관하니 어떻게 해결방안을 제시해 주시면 고맙겠습니다.
저는 아래와 같이 하겠습니다...
CREATE TABLE T31
(
YYYY VARCHAR2(4) not null, // 년도(Key)
MM VARCHAR2(2) not null, // 월(Key)
DD VARCHAR2(2) not null, // 일(Key)
BCOD VARCHAR2(7) not null, // 거래선코드(Key)
MCOD VARCHAR2(7) not null, // 상품코드(Key)
MA NUMBER(13, 0), // 판매금액
MQ NUMBER(13, 0) // 판매수량
);
Primary Key는 YYYY, MM, DD, BCOD, MCOD
뷰를 만든다...(집계 - 월별)
-- 아래의 문장을 적당히 수정하심 년도별, 년도/월별등 각종 집계가 가능합니다...
-- 월별 집계
CREATE OR REPLACE VIE V_T31 AS
SELECT YYYY, BCOD, MCOD,
SUM(DECODE(MM, '01', MA, 0)) MA01,
SUM(DECODE(MQ, '01', MA, 0)) MQ01,
SUM(DECODE(MM, '02', MA, 0)) MA02,
SUM(DECODE(MQ, '02', MA, 0)) MQ02,
SUM(DECODE(MM, '03', MA, 0)) MA03,
SUM(DECODE(MQ, '03', MA, 0)) MQ03,
SUM(DECODE(MM, '04', MA, 0)) MA04,
SUM(DECODE(MQ, '04', MA, 0)) MQ04,
SUM(DECODE(MM, '05', MA, 0)) MA05,
SUM(DECODE(MQ, '05', MA, 0)) MQ05,
SUM(DECODE(MM, '06', MA, 0)) MA06,
SUM(DECODE(MQ, '06', MA, 0)) MQ06,
SUM(DECODE(MM, '07', MA, 0)) MA07,
SUM(DECODE(MQ, '07', MA, 0)) MQ07,
SUM(DECODE(MM, '08', MA, 0)) MA08,
SUM(DECODE(MQ, '08', MA, 0)) MQ08,
SUM(DECODE(MM, '09', MA, 0)) MA09,
SUM(DECODE(MQ, '09', MA, 0)) MQ09,
SUM(DECODE(MM, '10', MA, 0)) MA10,
SUM(DECODE(MQ, '10', MA, 0)) MQ10,
SUM(DECODE(MM, '11', MA, 0)) MA11,
SUM(DECODE(MQ, '11', MA, 0)) MQ11,
SUM(DECODE(MM, '12', MA, 0)) MA12,
SUM(DECODE(MQ, '12', MA, 0)) MQ12
FROM T31
-- WHERE YYYY = '2001' -- 조건을 달면 2001년도 것만....
GROUP BY YYYY, BCOD, MCOD
건강하시구요, 행복하세여.. 그럼 1000 * 20...