본문으로 건너뛰기
AUISoft에이유아이소프트
AUIPivot v2.8 DEMO

판매 대수를 반영한 평균 가격

registerCustomAggregator

각 지점에서 차량 한 대가 평균 얼마에 팔렸는지 보여 줍니다. 매출 합계 ÷ 판매 대수로 계산합니다.

예를 들어 200만 원 차량 1대와 400만 원 차량 3대를 팔았다면 매출은 1,400만 원, 판매 대수는 4대입니다. 대당 평균 가격은 350만 원입니다.

가격 두 개만 더해 나눈 단순 평균은 300만 원입니다. 이 데모는 400만 원 차량이 세 대 팔린 것을 반영합니다. 이것을 가중 평균이라고 합니다.

registerCustomAggregator()로 이 계산을 등록하고, 등록한 id를 값 필드의 operation에 지정합니다. PRICE는 한 대 가격, COUNT는 판매 대수, TOTAL은 매출액입니다.

AUIPivot.registerCustomAggregator(myPivotID, {
    id: "WEIGHTED_AVG",
    version: 1,
    labelText: "가중 평균 가격",
    // weightField에는 판매 대수가 들어 있는 필드 이름을 전달합니다.
    validateOptions: function (options, context) {
        context.requireField(options.weightField);
    },
    create: function () {
        // 지점마다 가격에 판매 대수를 곱한 합계와 판매 대수 합계를 따로 모읍니다.
        return { weightedSum: 0, weightSum: 0 };
    },
    accumulate: function (state, value, context) {
        // value는 한 대 가격(PRICE), quantity는 같은 기록의 판매 대수(COUNT)입니다.
        const quantity = context.getValue(context.options.weightField);
        // 가격을 확인할 수 있고 판매 대수가 양수인 기록만 계산합니다.
        // 기존 계산처럼 0원과 음수 가격도 그대로 반영합니다.
        if (typeof value !== "number" || !Number.isFinite(value) ||
            typeof quantity !== "number" || !Number.isFinite(quantity) || quantity <= 0) return;
        // 400만 원 차량 3대를 팔았다면 매출 1,200만 원과 판매 3대를 더합니다.
        state.weightedSum += value * quantity;
        state.weightSum += quantity;
    },
    merge: function (target, source) {
        // 소계와 총계에서도 두 합계를 합칩니다. 지점별 평균을 다시 평균내지 않습니다.
        target.weightedSum += source.weightedSum;
        target.weightSum += source.weightSum;
    },
    finalize: function (state) {
        // 가격 × 판매 대수의 합계 ÷ 전체 판매 대수. 판매 대수가 없으면 빈칸입니다.
        return state.weightSum === 0 ? null : state.weightedSum / state.weightSum;
    }
});

AUIPivot.setValueFields(myPivotID, [
    // 1. 매출액을 모두 더합니다. 자동차 원본의 TOTAL은 PRICE × COUNT입니다.
    { dataField: "TOTAL", operation: "SUM", customLabelText: "매출 합계" },
    // 2. 판매기록 수가 아닌 실제 판매 대수를 더합니다. 한 기록이 3대이면 3을 더합니다.
    { dataField: "COUNT", operation: "SUM", customLabelText: "판매 대수" },
    // 3. 등록한 계산에 가격과 판매 대수를 전달하여 대당 평균 가격을 구합니다.
    {
        dataField: "PRICE",
        operation: "WEIGHTED_AVG",
        aggregatorOptions: { weightField: "COUNT" },
        customLabelText: "대당 평균 가격",
        formatString: "#,##0.00"
    }
]);

소계와 총계에서도 매출과 판매 대수를 각각 합친 뒤 나눕니다. 지점별 평균 가격을 다시 평균내지 않습니다.

함께 보기: 중복 고객을 고려한 고객당 평균 매출, 기준 가격 이상 차량의 판매 비중

자동차 판매 자료를 불러오는 중입니다.