> For the complete documentation index, see [llms.txt](https://www.analytics-docs.laplacetec.com/guide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.analytics-docs.laplacetec.com/guide/customdashboard/custom/custom_formula.md).

# 커스텀 포뮬러

{% hint style="info" %}
커스텀 포뮬러란?

커스텀 포뮬러는 라플라스에서 데이터를 분석할 때 **나만의 계산식을 만들 수 있는 기능**입니다. 엑셀이나 구글 스프레드시트의 수식과 비슷하게, 기존 측정값(Measure)과 분석단위(Dimension)를 조합하여 새로운 지표를 만들 수 있습니다.
{% endhint %}

#### 커스텀 포뮬러에서는 다음이 가능해요:

1. 비율 계산: 전환율, 평균 주문금액, 클릭당 비용 등 핵심 지표 계산
2. 목표 관리: 목표 달성률, 목표 대비 실적, 진행률 추적
3. 조건부 분석: 등급 분류, 세그먼트 구분, 조건부 집계
4. 문자열 처리: 데이터 정제, 파싱, 결합 및 변환
5. 날짜 연산: 기간 계산, 날짜 형식 변환, 분기별 분석
6. 복합 계산: ROAS, ROI, 순이익률 등 고급 지표

## 작동 원리 <a href="#working_principle" id="working_principle"></a>

Custom Formula는 다음과 같은 순서로 작동합니다:

1. 수식 입력

{% hint style="success" %}
예: DIVIDE('revenue', 'order\_count')
{% endhint %}

2. 구문 검증\
   문법 오류 체크 - 괄호, 따옴표, 함수명 검증
3. 타입 검증\
   데이터 타입 호환성 체크 - 숫자, 문자열, 날짜 타입 확인
4. SQL 변환\
   Trino SQL로 변환하여 데이터베이스 실행 가능한 쿼리 생성
5. 실행 & 결과\
   쿼리 실행 및 결과를 대시보드에 표시

## 엑셀과의 비교 <a href="#excel_comparison" id="excel_comparison"></a>

<table><thead><tr><th width="135">구분</th><th>액셀/스프레드시트</th><th>라플라스 Custom Formula셀 참조</th></tr></thead><tbody><tr><td>셀 참조</td><td>A1, B2:B10</td><td>'revenue', 'order_count'</td></tr><tr><td>함수</td><td>=SUM(A1:A10)</td><td>SUM('revenue')</td></tr><tr><td>조건문</td><td>=IF(A1>100, "High", "Low")</td><td>IF('revenue' > 100, "High", "Low")</td></tr><tr><td>문자</td><td>="Hello " &#x26; A1</td><td>CONCAT("Hello ", 'product_name')</td></tr></tbody></table>

{% hint style="info" %}
핵심 차이점

* 컬럼명은 **작은따옴표(\`'\`)**&#xB85C; 감쌉니다: 'revenue'
* 문자열 값은 **큰따옴표(\`"\`)**&#xB85C; 감쌉니다: "완료"
* 함수명은 **대문자**로 작성합니다: SUM, DIVIDE
  {% endhint %}

## 기본 문법 <a href="#basic_syntax" id="basic_syntax"></a>

### 1. 컬럼 참조 <a href="#column_reference" id="column_reference"></a>

"컬럼명"

```
예시
'revenue' - 매출
'order_count' - 주문수
'product_name' - 상품명
```

### 2. 숫자 리터럴 <a href="#numeric_literals" id="numeric_literals"></a>

```
100        # 정수
3.14       # 소수
-50        # 음수
```

### 3. 문자열 리터럴 <a href="#string_literals" id="string_literals"></a>

큰 따옴표를 사용합니다.

```
"텍스트"
"Hello World"
"완료"
```

### 4. 연산자 우선순위 <a href="#operator_precedence" id="operator_precedence"></a>

1. **()괄호**\
   가장 먼저 계산 됩니다.
2. **\* / 곱셈, 나눗셈**

   덧셈/뺄셈보다 먼저 계산
3. **+ - 덧셈, 뺄셈**

   곱셈/나눗셈 다음에 계산
4. **> < >= <= 비교 연산자**

   산술 연산 후 비교
5. **AND OR 논리 연산자**

   마지막으로 계산됩니다

## 연산자 <a href="#operator" id="operator"></a>

### 산술 연산자 <a href="#arithmetic_operators" id="arithmetic_operators"></a>

<table><thead><tr><th width="85">연산자</th><th width="117">설명</th><th>예시</th><th>결과 설명</th></tr></thead><tbody><tr><td>+</td><td>더하기</td><td>'revenue' + 'cost'</td><td>매출 + 비용</td></tr><tr><td>-</td><td>빼기</td><td>'revenue' - 'cost'</td><td>순이익</td></tr><tr><td>*</td><td>곱하기</td><td>'quantity' * 'unit_price'</td><td>총 금액</td></tr><tr><td>/</td><td>나누기</td><td>'revenue' / 'order_count'</td><td>평균 주문금액</td></tr><tr><td>%</td><td>나머</td><td>'number' % 2</td><td>홀짝 판별용</td></tr></tbody></table>

### 비교 연산자 <a href="#comparison_operators" id="comparison_operators"></a>

평균 주문금액(AOV) = 총 매출/ 주문건수

```
DIVIDE('revenue', 'order_count')
```

### 논리 연산자 <a href="#logical_operators" id="logical_operators"></a>

<table><thead><tr><th width="114">연산자</th><th width="189">설명</th><th>예시</th></tr></thead><tbody><tr><td>AND</td><td>그리고 (둘 다 참)</td><td>'revenue' > 1000 AND 'status' = "완료"</td></tr><tr><td>OR</td><td>또는 (하나라도 참)</td><td>'category' = "의류" OR 'category' = "잡화"</td></tr><tr><td></td><td></td><td></td></tr></tbody></table>

## 함수 종류 <a href="#function_types" id="function_types"></a>

### 집계 함수 <a href="#aggregate_functions" id="aggregate_functions"></a>

<table><thead><tr><th width="120">함수</th><th>문법</th><th width="116">설명</th><th>예시</th></tr></thead><tbody><tr><td>SUM</td><td>SUM(value)</td><td>합계</td><td>SUM('revenue')</td></tr><tr><td>AVG</td><td>AVG(value)</td><td>평균</td><td>AVG('order_amount')</td></tr><tr><td>COUNT</td><td>COUNT(value)</td><td>개수</td><td>COUNT('order_id')</td></tr><tr><td>MIN</td><td>MIN(value)</td><td>최솟값</td><td>MIN('price')</td></tr><tr><td>MAX</td><td>MAX(value)</td><td>최댓값</td><td>MAX('purchase_date')</td></tr></tbody></table>

### 수학 함수 <a href="#acceptance_functions" id="acceptance_functions"></a>

<table><thead><tr><th width="126">함수</th><th>문법</th><th width="117">설명</th><th>예시</th></tr></thead><tbody><tr><td>MULTIPLY</td><td>MULTIPLY(a, b)</td><td>곱셈</td><td>MULTIPLY('quantity', 'unit_price')</td></tr><tr><td>DIVIDE</td><td>DIVIDE(a, b)</td><td>나눗셈</td><td>DIVIDE('revenue', 'order_count')</td></tr><tr><td>SUBTRACT</td><td>SUBTRACT(a, b)</td><td>뺼셈</td><td>SUBTRACT('revenue', 'cost')</td></tr><tr><td>ABS</td><td>ABS(value)</td><td>절댓값</td><td>ABS('profit_loss')</td></tr><tr><td>ROUND</td><td>ROUND(value, [decimals])</td><td>반올림</td><td>ROUND('avg_price', 2)</td></tr><tr><td>FLOOR</td><td>FLOOR(value)</td><td>내림</td><td>FLOOR('decimal_value')</td></tr><tr><td>CEIL</td><td>CEIL(value)</td><td>올림</td><td>CEIL('decimal_value')</td></tr><tr><td>POWER</td><td>POWER(base, exponent)</td><td>거듭제곱</td><td>POWER(2, 3)</td></tr><tr><td>SQRT</td><td>SQRT(value)</td><td>제곱근</td><td>SQRT(16)</td></tr><tr><td>MOD</td><td>MOD(a, b)</td><td>나머지</td><td>MOD(10, 3)</td></tr></tbody></table>

### 조건 함수 <a href="#conditional_functions" id="conditional_functions"></a>

<table><thead><tr><th width="128">함수</th><th>문법</th><th width="115">설명</th><th>예시</th></tr></thead><tbody><tr><td>IF</td><td>IF(condition, true_value, false_value)</td><td>조건문</td><td>IF('revenue' > 1000, "우수", "보통")</td></tr><tr><td>IFS</td><td>IFS(cond1, val1, cond2, val2, ...)</td><td>다중 조건문</td><td>IFS('revenue' >= 10000, "최우수", 'revenue' >= 5000, "우수", TRUE, "보통")</td></tr><tr><td>COALESCE</td><td>COALESCE(val1, val2, ...)</td><td>NULL 대체</td><td>COALESCE('discount', 0)</td></tr><tr><td>NULLIF</td><td>NULLIF(val1, val2)</td><td>같으면 NULL</td><td>NULLIF('order_count', 0)</td></tr></tbody></table>

### 문자열 함수 <a href="#string_functions" id="string_functions"></a>

<table><thead><tr><th width="109">함수</th><th>문법</th><th width="116">설명</th><th>예시</th></tr></thead><tbody><tr><td>CONCAT</td><td>CONCAT(str1, str2, ...)</td><td>문자열 결합</td><td>CONCAT('first_name', " ", 'last_name')</td></tr><tr><td>UPPER</td><td>UPPER(text)</td><td>대문자 변환</td><td>UPPER('product_code')</td></tr><tr><td>LOWER</td><td>LOWER(text)</td><td>소문자 변환</td><td>LOWER('email')</td></tr><tr><td>TRIM</td><td>TRIM(text)</td><td>공백 제거</td><td>TRIM('address')</td></tr><tr><td>LENGTH</td><td>LENGTH(text)</td><td>문자열 길이</td><td>LENGTH('product_name')</td></tr><tr><td>SUBSTR</td><td>SUBSTR(text, start, [length])</td><td>부분 문자열</td><td>SUBSTR('phone', 1, 3)</td></tr><tr><td>REPLACE</td><td>REPLACE(text, old, new)</td><td>문자열 치</td><td>REPLACE('address', "서울", "Seoul")</td></tr></tbody></table>

### 날짜/시간 함수 <a href="#datetime_functions" id="datetime_functions"></a>

<table><thead><tr><th width="157">함수</th><th>문법</th><th width="111">설명</th><th>예시</th></tr></thead><tbody><tr><td>NOW</td><td>NOW()</td><td>현재 시각</td><td>NOW()</td></tr><tr><td>CURRENT_DAT</td><td>CURRENT_DATE()</td><td>오늘 날짜</td><td>CURRENT_DATE()</td></tr><tr><td>DATE</td><td>DATE(year, month, day)</td><td>날짜 생성</td><td>DATE(2024, 1, 15)</td></tr><tr><td>YEAR</td><td>YEAR(date)</td><td>연도 추출</td><td>YEAR('time_id')</td></tr><tr><td>MONTH</td><td>MONTH(date)</td><td>월 추출</td><td>MONTH('time_id')</td></tr><tr><td>DAY</td><td>DAY(date)</td><td>일 추출</td><td>DAY('time_id')</td></tr><tr><td>WEEK</td><td>WEEK(date)</td><td>주차 추출</td><td>WEEK('time_id')</td></tr><tr><td>DAY_OF_WEEK</td><td>DAY_OF_WEEK(date)</td><td>요일 (1=월)</td><td>DAY_OF_WEEK('time_id')</td></tr><tr><td>QUARTER</td><td>QUARTER(date)</td><td>분기</td><td>QUARTER('time_id')</td></tr><tr><td>DATE_DIFF</td><td>DATE_DIFF(unit, date1, date2)</td><td>날짜 차이</td><td>DATE_DIFF("day", 'start_date', 'end_date')</td></tr><tr><td>DATE_ADD</td><td>DATE_ADD(unit, value, date)</td><td>날짜 더하기</td><td>DATE_ADD("day", 7, 'order_date')</td></tr><tr><td>DATE_TRUNC</td><td>DATE_TRUNC(unit, date)</td><td>날짜 절삭</td><td>DATE_TRUNC("month", 'time_id')</td></tr><tr><td>DATE_FORMAT</td><td>DATE_FORMAT(date, format)</td><td>날짜 형식화</td><td>DATE_FORMAT('time_id', "%Y-%m-%d")</td></tr></tbody></table>

### 정규식 함수 <a href="#regex_functions" id="regex_functions"></a>

<table><thead><tr><th>함수</th><th>문법</th><th width="123">설명</th><th>예시</th></tr></thead><tbody><tr><td>REGEXP_EXTRACT</td><td>REGEXP_EXTRACT(text, pattern)</td><td>정규식 추출</td><td>REGEXP_EXTRACT('url', "utm_source=([^&#x26;]+)")</td></tr><tr><td>REGEXP_REPLACE</td><td>REGEXP_REPLACE(text, pattern, replacement)</td><td>정규식 치환</td><td>REGEXP_REPLACE('phone', "[^0-9]", "")</td></tr></tbody></table>

### 타입 변환 함수 <a href="#type_conversion_functions" id="type_conversion_functions"></a>

<table><thead><tr><th width="93">함수</th><th>문법</th><th width="124">설명</th><th>예시</th></tr></thead><tbody><tr><td>CAST</td><td>CAST(value, "TYPE")</td><td>타입 변환</td><td>CAST('amount', "DOUBLE")</td></tr></tbody></table>

{% hint style="warning" %}
`VARCHAR`, `DOUBLE`, `BIGINT`, `BOOLEAN`, `DATE`, `TIMESTAMP`
{% endhint %}

## 예제 <a href="#examples" id="examples"></a>

### 비율 계산 <a href="#ratio_calculation" id="ratio_calculation"></a>

<table><thead><tr><th width="141">항목</th><th width="183">계산</th><th width="296">문법</th><th>결과값</th></tr></thead><tbody><tr><td>전환율(CVR)</td><td>(주문수 ÷ 클릭수) × 100</td><td>DIVIDE('order_count', 'clicks') * 100</td><td>5.0%</td></tr><tr><td>평균 주문금액 (AOV)</td><td>매출 ÷ 주문수</td><td>DIVIDE('revenue', 'order_count')</td><td>₩ 50,000</td></tr><tr><td>클릭당 비용 (CPC)</td><td>광고비 ÷ 클릭수</td><td>ROUND(DIVIDE('ad_cost', 'clicks'), 2)</td><td>₩ 200</td></tr><tr><td>ROAS</td><td>(매출 ÷ 광고비) × 100</td><td>ROUND(DIVIDE('revenue', 'ad_cost') * 100, 1)</td><td>500%</td></tr></tbody></table>

### 목표 관리 <a href="#goal_management" id="goal_management"></a>

<table><thead><tr><th width="141">항목</th><th width="183">계산</th><th width="296">문법</th><th>결과값</th></tr></thead><tbody><tr><td>목표 달성률</td><td>(실제 매출 ÷ 목표 매출) × 100</td><td>ROUND(DIVIDE('revenue', 'target_revenue') * 100, 1)</td><td>85%</td></tr><tr><td>목표 달성 등급</td><td>S (130%↑) / A (110%↑) / B (90%↑) / C (90%↓)</td><td>IFS(<br>DIVIDE('revenue', 'target_revenue') >= 1.3, "S등급",<br>DIVIDE('revenue', 'target_revenue') >= 1.1, "A등급",<br>DIVIDE('revenue', 'target_revenue') >= 0.9, "B등급",<br>TRUE, "C등급"<br>)</td><td>A등급</td></tr><tr><td>목표 대비 차이</td><td>실제 매출 - 목표 매출</td><td>SUBTRACT('revenue', 'target_revenue')</td><td>+ ₩ 2,000,000</td></tr><tr><td>일평균 필요 매</td><td>(목표 - 현재) ÷ 남은 일수</td><td>ROUND( DIVIDE( SUBTRACT('target_revenue', 'current_revenue'), 'days_remaining' ), 0 )</td><td>₩ 1,200,000/</td></tr></tbody></table>

### 고객 세분화 <a href="#customer_segmentation" id="customer_segmentation"></a>

<table><thead><tr><th width="141">항목</th><th width="183">계산</th><th width="296">문법</th><th>결과값</th></tr></thead><tbody><tr><td>고객 등급 분류</td><td>플래티넘 (50K↑) / 골드 (20K↑) / 실버 (10K↑) / 브론즈</td><td>IFS(<br>'revenue' >= 50000, "플래티넘",<br>'revenue' >= 20000, "골드",<br>'revenue' >= 10000, "실버",<br>TRUE, "브론즈"<br>)</td><td></td></tr><tr><td>주말/평일 구분</td><td>요일 번호로 주말 판별</td><td>IF(DAY_OF_WEEK('time_id') >= 6, "주말", "평일")</td><td></td></tr><tr><td>신규/재구매 고객</td><td>주문 횟수로 고객 유형 분류</td><td>IF('order_count' > 1, "재구매", "신규")</td><td></td></tr><tr><td>연령대 분류</td><td>35세 → "30대"</td><td>CONCAT(<br>CAST(FLOOR('age' / 10) * 10, "VARCHAR"),<br>"대"<br>)</td><td></td></tr></tbody></table>

## 팁과 주의사항 <a href="#tips_cautions" id="tips_cautions"></a>

### 권장 사항 <a href="#recommendations" id="recommendations"></a>

{% hint style="success" %}

1. 괄호로 우선순위 명확히

복잡한 수식은 괄호로 의도를 명확하게 표현하세요.

```
❌ 'a' + 'b' * 'c' / 'd'
✅ 'a' + (('b' * 'c') / 'd')
```

{% endhint %}

{% hint style="success" %}
2\. NULL과 0으로 나누기 방지

나눗셈 전에 항상 0 체크를 하세요.

```
❌ DIVIDE('revenue', 'order_count')
✅ DIVIDE('revenue', NULLIF('order_count', 0))
```

{% endhint %}

{% hint style="success" %}
3\. 타입 일치 확인

비교/연산 시 같은 타입끼리 사용하세요.

```
❌ 'revenue' > "1000"   (숫자 vs 문자열)
✅ 'revenue' > 1000     (숫자 vs 숫자)
```

{% endhint %}

### 주의 사항 <a href="#warnings" id="warnings"></a>

| 항목       | ❌ 잘못된 예              | ✅ 올바른 예        |
| -------- | -------------------- | -------------- |
| 함수명 대소문자 | sum('revenue')       | SUM('revenue') |
| 컬럼 참조    | revenue 또는 "revenue" | 'revenue'      |
| 문자열      | '완료'                 | "완료"           |
| 컬럼명 오타   | 'revenu'             | 'revenue'      |

{% hint style="danger" %}
**순환 참조 금지**

수식이 자기 자신을 참조하면 오류가 발생합니다. 다른 수식을 참조하는 것은 가능하지만, 순환 참조는 피해야 합니다.
{% endhint %}

## 자주 묻는 질문 (FAQ)

<details>

<summary>Q. 수식이 작동하지 않아요. 어떻게 해야 하나요?</summary>

**체크리스트:**

1. 함수명이 대문자인가요? (`SUM`, `IF`)
2. 컬럼명을 작은따옴표로 감쌌나요? (`'revenue'`)
3. 문자열을 큰따옴표로 감쌌나요? (`"완료"`)
4. 괄호가 제대로 닫혔나요?

</details>

<details>

<summary>Q. 다른 수식을 참조할 수 있나요?</summary>

**네, 가능합니다!**\
\
먼저 "평균 주문금액" 수식을 만들고:\
`DIVIDE('revenue', 'order_count')`\
\
그 다음 다른 수식에서 참조:\
`IF('평균 주문금액' > 50000, "VIP", "일반")`\
\
⚠️ **주의:** 순환 참조는 금지됩니다.

</details>

<details>

<summary>Q. 수식 성능을 개선하려면?</summary>

**권장 사항:**

1. 복잡한 정규식은 최소화해주세요.
2. 중복 계산은 별도 수식으로 분리하여 재사용해주세요.
3. 필요한 데이터만 필터링하여 사용해주세요.

</details>

## 전담 매니저에게 요청하기 <a href="#contact" id="contact"></a>

커스텀 포뮬러 이용에 어려움이 있으신가요?

하단의 문의하기 혹은 홈페이지의 채널톡을 통해 문의하세요. 담당 매니저가 데이터 연결에 도움을 드리도록 하겠습니다.

> 💬 [채널톡으로 문의하기](https://laplacetec.channel.io/lounge)
>
> 💬 [홈페이지에서 문의하기](https://www.analytics.laplacetec.com/contact)

**이메일 문의:** [**product@laplacetec.com**](mailto:product@laplacetec.com)
