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

가격대, 차종별 판매 포트폴리오

Report

가격대별 판매 대수, 매출액과 평균 가격을 비교한 보고서입니다.

setDerivedFields로 가격 구간을 정의하고 PRICE_RANGE를 행 필드에 놓으십시오. 가중 평균은 판매 대수를 가중치로 사용하는 WEIGHTED_AVG 연산자를 등록하여 계산합니다.

가격대의 min은 포함하고 max는 제외합니다. 기간 또는 지점을 변경하면 기존 필터를 해제하고 선택한 조건을 적용합니다.

// 가중 평균을 이 표에 먼저 등록합니다.
AUIPivot.registerCustomAggregator(myPivotID, {
    // 이 항목을 설정에서 참조할 식별자입니다.
    id: "WEIGHTED_AVG",
    // 저장한 보고서에서 계산 정의를 구분할 버전입니다.
    version: 1,
    // 화면에서 읽을 표시 이름입니다.
    labelText: "대수 가중 평균",
    // options는 추가 설정, context는 필드 존재 여부를 확인하는 도구입니다.
    validateOptions: function (options, context) {
        context.requireField(options.weightField);
    },

    // 그룹마다 별도의 누적 상태를 만들어 반환합니다. 다른 그룹과 공유하지 않습니다.
    create: function () {
        return {
            weightedSum: 0,
            weightSum: 0
        };
    },

    // state는 누적 상태, value는 이번 기록의 값, context는 같은 기록의 다른 필드를 읽는 도구입니다.
    accumulate: function (state, value, context) {
        const weight = context.getValue(context.options.weightField);
        if (typeof value === "number" && Number.isFinite(value) && typeof weight === "number" && Number.isFinite(weight) && weight > 0) {
            state.weightedSum += value * weight;
            state.weightSum += weight;
        }
    },

    // source에 모인 값을 target에 더합니다. 두 그룹의 상태를 합치는 단계입니다.
    merge: function (target, source) {
        target.weightedSum += source.weightedSum;
        target.weightSum += source.weightSum;
    },

    // state에 모인 값으로 최종 숫자를 반환합니다. 계산할 수 없으면 null을 반환합니다.
    finalize: function (state) {
        return state.weightSum ? state.weightedSum / state.weightSum : null;
    }
});

AUIPivot.setDerivedFields(myPivotID, [
    // 가격대: PRICE 값을 아래 네 구간 중 하나로 분류합니다.
    {
        dataField: "PRICE_RANGE",
        labelText: "가격대",
        sourceField: "PRICE", // 분류할 원본 필드
        // min은 포함하고 max는 제외합니다. null은 그쪽 경계가 없다는 뜻입니다.
        // id는 필터 등에서 사용하는 값이고 labelText는 화면에 보이는 이름입니다.
        ranges: [
            { id: "under2m", min: 0, max: 2000000, labelText: "2,000,000 미만" },
            { id: "from2m", min: 2000000, max: 3000000, labelText: "2,000,000~3,000,000 미만" },
            { id: "from3m", min: 3000000, max: 4000000, labelText: "3,000,000~4,000,000 미만" },
            { id: "from4m", min: 4000000, max: null, labelText: "4,000,000 이상" }
        ],
        // 위 구간에 들어가지 않는 값은 기타로 분류합니다.
        fallback: { id: "other", labelText: "기타" }
    }
]);

// 가격대, 차종 순서로 행을 묶습니다.
AUIPivot.setRowFields(myPivotID, ["PRICE_RANGE", "NAME"]);

// 값 필드와 집계 연산자 지정하기
AUIPivot.setValueFields(myPivotID, [
    // 판매 대수
    { dataField: "COUNT", operation: "SUM", customLabelText: "판매 대수", formatString: "#,##0" },
    // 매출액
    { dataField: "TOTAL", operation: "SUM", customLabelText: "매출액", formatString: "#,##0" },
    // 단순 평균 가격
    { dataField: "PRICE", operation: "AVG", customLabelText: "단순 평균 가격", formatString: "#,##0.00" },
    // 대수 가중 평균
    { dataField: "PRICE", operation: "WEIGHTED_AVG", customLabelText: "대수 가중 평균", formatString: "#,##0.00",
      aggregatorOptions: {weightField: "COUNT"} },
    // 매출 비중
    { dataField: "TOTAL", operation: "GRAND_TOTAL_RATIO", customLabelText: "매출 비중", formatString: "0.00%" }
]);

함께 보기: 사용자 집계, 가중 평균 결과 비교