AgentSkillsCN

iaud-olap-formula

i-OLAP 公式编写指南。本指南将为您介绍 OlapGrid 计算字段、自定义项目以及条件格式中所使用的公式函数与语法。当您需要了解“OLAP 公式”“计算字段”“ForAll”“ForEach”“聚合函数”“Rank”“条件格式公式”等相关内容时,可参考本指南。

SKILL.md
--- frontmatter
name: iaud-olap-formula
description: i-OLAP 수식 작성 가이드. OlapGrid 계산 필드, 사용자 정의 항목, 조건부 서식에서 사용하는 수식 함수와 문법을 안내합니다. "OLAP 수식", "계산 필드", "ForAll", "ForEach", "집계 함수", "Rank", "조건부 서식 수식" 등을 물어볼 때 사용하세요.

i-OLAP 함수 작성 가이드

이 문서는 i-OLAP 서버의 수식 엔진에서 사용할 수 있는 함수, 상수, 변수 바인딩 규칙을 정리한 가이드입니다.


1. 개요

1.1. 수식 사용 위치

i-OLAP에서 함수는 다음 세 곳에서 사용됩니다.

사용 위치설명
계산 필드OLAP 그리드의 속성 창에서 필드를 추가한 뒤, 수식 편집창에서 수식을 입력합니다.
계산 항목 (사용자 정의 항목)디멘전 항목의 context menu에서 [사용자 정의 항목]을 클릭하여 생성합니다. 필터 수식(bool 반환)과 집계 수식 두 가지로 구성됩니다.
조건부 서식사전 정의된 스타일의 이름 또는 키 값을 반환하는 수식을 작성합니다.

1.2. Context 이해

수식이 사용되는 위치에 따라 Context가 달라집니다.

Context설명
DataCell Context계산 필드를 값 영역에 배치할 때 사용. 다수의 레코드를 대상으로 계산합니다.
HeaderCell Context계산 필드를 헤더 영역(Row/Column)에 배치할 때 사용. 전체 레코드를 순차적으로 단일 레코드씩 계산합니다. 레코드가 많으면 성능 저하 우려.
Filter Context사용자 정의 항목의 필터 수식에서 사용. 모든 레코드를 순회하며 true/false를 반환하여 항목 포함 여부를 결정합니다.

1.3. 필드 참조 문법

수식에서 필드를 참조할 때는 **대괄호([])**로 감싸서 사용합니다.

code
[필드명]
[COMPANY]
[판매수량]

1.4. 연산자

연산자설명
+덧셈
-뺄셈
*곱셈
/나눗셈
%나머지
==같음 비교
!=같지 않음 비교
>크다
<작다
>=크거나 같다
<=작거나 같다

1.5. 주석

code
// 라인 주석
/* 멀티 라인 주석 */

2. 변수 바인딩 및 상수 선언

2.1. 변수 바인딩

수식 내부에 동적으로 조건이나 값을 변경할 수 있도록 변수 바인딩을 지원합니다. 변수 바인딩 규칙은 :변수명 형식을 사용합니다.

code
SUM([Units]) / :VN_UNIT

실행 시 :VN_UNIT은 바인딩된 값(예: 10)으로 치환되어 SUM([Units]) / 10이 됩니다.

2.2. 동적 필드 선언 (define)

define은 수식 내에서 동적으로 필드를 선언합니다. 다른 수식에서 필드를 파라미터로 받는 경우, 해당 필드를 사전에 등록하는 용도로 사용합니다. define으로 선언한 필드는 셀 계산 시마다 수식이 평가되어 동적으로 값이 결정됩니다.

문법:

code
define 필드명 = 수식

사용 시 [] 필수: define으로 선언한 필드를 참조할 때는 일반 필드와 동일하게 대괄호([])로 감싸서 필드임을 표시해야 합니다.

제약 사항: 순차적으로 파싱되므로, 사용하기 전에 선언해야 합니다.

예제 1: 뉴욕 판매 비중 계산

code
// 뉴욕판매수량을 동적 필드로 선언 → 참조 시 [뉴욕판매수량]으로 사용
define 뉴욕판매수량  = IF( [지역] == "뉴욕", [판매수량] , 0)
define 뉴욕_수량     = Sum( ForEach("[지역]", [뉴욕판매수량]) )
IF([판매수량]== 0, 0,  [뉴욕_수량]  /[판매수량])

멀티라인 수식: 중괄호 {}를 사용하여 멀티라인 수식을 작성할 수 있습니다.

code
define V_CALC = {
  IF([지역] == "뉴욕", [판매수량], 0)
}
// 사용 시: [V_CALC]

2.3. 상수 정의 (const)

const상수를 정의합니다. 한 번 계산된 값을 고정으로 보유하며, 이후 수식에서 해당 값으로 대체되어 계산됩니다. define과 달리 셀마다 재평가되지 않습니다.

문법:

code
const 상수명 = 값 또는 수식

예제:

code
const RATE = 1.1
const BASE = 100

[판매수량] * RATE + BASE

3. 내장 상수

수식 내에서 사용할 수 있는 내장 상수입니다.

상수명타입설명
IsRowGrandTotalbool데이터 셀의 Row 헤더가 총계인지 여부
IsColGrandTotalbool데이터 셀의 Column 헤더가 총계인지 여부
IsRowTotalbool데이터 셀의 Row 헤더가 소계인지 여부
IsColTotalbool데이터 셀의 Column 헤더가 소계인지 여부
IsTotalbool데이터 셀의 헤더가 소계인지 여부
IsGrandTotalbool데이터 셀의 헤더가 총계인지 여부
IsTotalOrGrandTotalbool데이터 셀의 헤더가 총계 또는 소계인지 여부
CELL_VALUEobject데이터 셀의 값
FIELD_KEYstring데이터 셀의 데이터 필드의 키값
FIELD_LABELstring데이터 셀의 데이터 필드의 표시명

활용 예:

code
// 소계/총계 행에서는 빈 값을 반환
IF(IsTotalOrGrandTotal, "", [판매수량] / [목표수량] * 100)

4. 함수 레퍼런스

4.1. 조건 분기 함수

IF / IIF

조건 검사를 수행하여 참이면 trueValue를, 거짓이면 falseValue를 반환합니다.

code
IF(condition, trueValue, falseValue)
IIF(condition, trueValue, falseValue)
파라미터타입설명
conditionbool조건식
trueValueobject조건이 참일 때 반환값
falseValueobject조건이 거짓일 때 반환값

반환 타입: object

예제:

code
IF( 1 > 2, "1은 2보다 크다", "1은 2보다 작다")
// => "1은 2보다 작다"

IF( [판매수량] > 100, "초과", "미달")

SWITCH / CASE

조건 n개에 대해 순차적으로 검사하여 가장 처음으로 참인 조건의 값을 반환합니다.

code
SWITCH(condition1, value1, condition2, value2, ..., defaultValue)
CASE(condition1, value1, condition2, value2, ..., defaultValue)
파라미터타입설명
condition1bool조건 1
value1object조건1이 참일 때 반환값
......반복
defaultValueobject모든 조건이 거짓일 때 기본값

반환 타입: object

예제:

code
CASE(
  1==2, "1과 2는 같다",
  2==1, "2와 1은 같다",
  1==1, "1과 1은 같다",
  "같은 조건이 없다"
)
// => "1과 1은 같다"

4.2. 논리 함수

AND

넘겨진 파라미터 n개의 논리곱(AND)을 반환합니다.

code
AND(bool1, bool2, ..., boolN)

반환 타입: bool

예제:

code
IF( AND(true, 1==1, "Korea" == "Korea"), 1, 0)   // => 1
IF( AND(true, 1==2, "Korea" == "Korea"), 1, 0)   // => 0

OR

넘겨진 파라미터 n개의 논리합(OR)을 반환합니다.

code
OR(bool1, bool2, ..., boolN)

반환 타입: bool

예제:

code
IF( OR(1==2, "Korea" == "Korea"), 1, 0)   // => 1
IF( OR(1==2, "Korea" == "Europe"), 1, 0)  // => 0

IsNull

검사 대상 값이 null인지 여부를 반환합니다.

code
IsNull(value)

반환 타입: bool

IsBool

검사 대상 값이 Boolean인지 여부를 반환합니다.

code
IsBool(value)

반환 타입: bool

IsNumber

검사 대상 값이 숫자형인지 여부를 반환합니다.

code
IsNumber(value)

반환 타입: bool

예제:

code
IsNumber("100")    // => true
IsNumber(100)      // => true
IsNumber("Korea")  // => false

IsString

검사 대상 값의 타입이 문자열인지 여부를 반환합니다.

code
IsString(value)

반환 타입: bool

IsDateTime

검사 대상 값의 타입이 DateTime인지 여부를 반환합니다.

code
IsDateTime(value)

반환 타입: bool

예제:

code
IsDateTime(DATE(2013, 12, 12))  // => true
IsDateTime("2013-12-12")        // => false

4.3. 변환 함수

ToString

넘겨진 값을 문자열로 변환합니다.

code
ToString(value)
ToString(value, format)
파라미터타입설명
valueobject변환 대상값
formatstring (Optional)변환 포맷 (수치형/일자형)

반환 타입: string

예제:

code
ToString(DATE(2014,01,01), "yyyyMMdd")    // => "20140101"
ToString(0.12, "P2")                      // => "12.00 %"
ToString(123456.789, "#,###.###")         // => "123,456.789"

ToNumber

값을 숫자형으로 변환합니다. 실패 시 failValue를 반환합니다.

code
ToNumber(value, failValue)
파라미터타입설명
valueobject변환 대상값
failValueobject (Optional)변환 실패시 기본값

반환 타입: double

예제:

code
ToNumber("123.12", 0)   // => 123.12
ToNumber("Matrix", 0)   // => 0

ToDate

넘겨진 값을 일자형으로 변환합니다.

code
ToDate(value)
ToDate(value, format)
파라미터타입설명
valueobject변환 대상값
formatstring (Optional)일자형 포맷

반환 타입: DateTime

예제:

code
ToDate("2014-12-12", "yyyy-MM-dd")   // => 2014-12-12

4.4. 집계 함수 (Aggregate)

Sum

전달값에 대한 합계를 반환합니다.

code
Sum([FIELD_NAME])
Sum(value1, value2, ..., valueN)

반환 타입: double

Average

전달값에 대한 평균값을 반환합니다.

code
Average([FIELD_NAME])
Average(value1, value2, ..., valueN)

반환 타입: double

Count

전달값에 대한 개수를 반환합니다.

code
Count([FIELD_NAME])
Count(value1, value2, ..., valueN)

반환 타입: double

DistinctCount

데이터 셀에서 해당 필드의 값 리스트 중 중복값을 제거한 수량을 반환합니다.

code
DistinctCount([FIELD_NAME])

반환 타입: double

Max / Min

전달값에 대해 최대값/최소값을 반환합니다. 문자형과 수치형 모두 지원합니다.

code
Max([FIELD_NAME])
Min([FIELD_NAME])

반환 타입: object

AverageOfChild

현재 셀의 자식 데이터 셀을 기준으로 평균을 계산한 값을 반환합니다.

code
AverageOfChild([FIELD_NAME])

반환 타입: double


4.5. OLAP/큐브 함수

AreaIsRow / AreaIsColumn / AreaIsData / AreaIsFilter / AreaIsHidden

전달 받은 필드가 배치된 영역을 판별합니다.

code
AreaIsRow([FIELD_NAME])
AreaIsColumn([FIELD_NAME])
AreaIsData([FIELD_NAME])
AreaIsFilter([FIELD_NAME])
AreaIsHidden([FIELD_NAME])

반환 타입: bool

AreaIndex / Area

필드가 해당 영역 내에서 몇 번째 위치인지 인덱스를 반환합니다.

code
AreaIndex([FIELD_NAME])
Area([FIELD_NAME])

IsHeaderTotal

현재 헤더가 특정 필드의 소계인지 여부를 반환합니다.

code
IsHeaderTotal([FIELD_NAME])

반환 타입: bool

HeaderText

화면에 배치된 상태에서 헤더영역(Row/Column)의 필드 표시 텍스트를 반환합니다.

code
HeaderText([FIELD_NAME])

반환 타입: string

ForAll

배치에 대해 제어하는 함수로, 현재 배치를 기준으로 Dimensions에 정의된 항목을 제거하여 상위 합에 대한 접근이 가능하게 합니다. 비율 계산 시 주로 사용됩니다. SQL의 그룹핑 기능과 유사하게 동작합니다.

code
ForAll("Dimensions", [MEASURE])
ForAll("Dimensions", [MEASURE], NoFilter)
파라미터타입설명
Dimensionsstring현재 배치에서 제외할 디멘전 목록 (;로 구분)
Measurestring계산할 대상 필드명
NoFilterbool (Optional)필터 정보 미반영 여부 (기본값: false)

반환 타입: object (Measure의 계산 결과)

예제: 전체 대비 비율 계산

code
// [COMPANY] 디멘전을 제외한 전체 합계 대비 비율
[판매수량] / ForAll("[COMPANY]", [판매수량]) * 100

ForEach

배치에 대해 제어하는 함수로, 현재 배치를 기준으로 Dimensions에 정의된 항목을 추가하여 하위 목록의 그룹 데이터를 반환합니다. 특정 레벨로 그룹하여 평균 등을 계산할 때 주로 사용됩니다.

code
ForEach("Dimensions", [MEASURE])
파라미터타입설명
Dimensionsstring추가할 디멘전 목록 (;로 구분)
Measurestring계산할 대상 필드명

반환 타입: Record Array

예제:

code
// 지역별 그룹 데이터의 합계
Sum(ForEach("[지역]", [판매수량]))

InList

대상 필드의 값이 비교 값 목록 내에 존재하는지 여부를 반환합니다.

code
InList([FIELD_NAME], "value1", "value2", ..., "valueN")

반환 타입: bool

예제:

code
InList([지역], "서울", "부산", "대구")
// InList의 역: InList([필드명], "항목1", "항목2") == false
// 배열 형식: InList([Locale], ["a","b","c","d"])

InDimension

특정 디멘전을 제외하고 값을 계산합니다.

code
InDimension("Dimensions", [MEASURE])

반환 타입: object

Match

대상 필드의 값이 문자열 패턴에 일치하는지 여부를 반환합니다. 대/소문자를 구분합니다.

code
Match([FIELD_NAME], "pattern")

패턴 규칙:

  • *a : a로 끝나는 모든 문자열
  • a* : a로 시작하는 모든 문자열
  • *a* : a가 포함된 모든 문자열

반환 타입: bool

GetMembers

현재 배치된 화면에서 특정 항목에 일치하는 데이터 셀을 검색하고 해당 셀의 값들을 반환합니다.

code
GetMembers([FIELD_NAME], "keyword", [MEASURE])
GetMembers([FIELD_NAME], "keyword", [MEASURE], "noCheckField")

반환 타입: Record Array

예제: Korea 대비 비중값 구하기

code
[판매수량] / Sum(GetMembers([지역], "Korea", [판매수량])) * 100

Rank

특정값을 기준으로 디멘전 항목에 대한 순위를 계산합니다.

code
Rank("DIMENSION_LIST", [MEASURE])
Rank("DIMENSION_LIST", [MEASURE], isTop)
파라미터타입설명
DIMENSION_LISTstring순위를 적용할 Dimension 필드 목록 (*=전체 필드)
MEASUREstring순위 계산에 사용할 필드 (문자열로 전달)
isTopbool (Optional)값이 큰 항목부터 순위 지정 여부

반환 타입: int

예제:

code
Rank("[Company]", "[Units]", true)
Rank(GetRowFields(""), "[Units]", true)

RankIn

화면 배치에 따라 자동으로 마지막 단계에 해당하는 항목의 순위를 반환합니다.

code
RankIn([MEASURE], direction, isTop)
파라미터타입설명
MEASUREfield순위 계산에 사용할 필드
directionintRank 계산 방향 (1=Row, 2=Column)
isTopbool값이 큰 항목부터 순위 지정 여부

반환 타입: int

CellValueByOffset

현재 셀의 위치를 기준으로 특정 위치의 셀의 값을 반환합니다.

code
CellValueByOffset(offsetRow, offsetColumn)
CellValueByOffset(offsetRow, offsetColumn, visibleCellOnly)
CellValueByOffset(offsetRow, offsetColumn, visibleCellOnly, targetField)

예제: 전년 대비 증감률

code
CELL_VALUE - CellValueByOffset(0, -1)

ColumnIndex / RowIndex / DisplayColumn / DisplayRow

셀의 위치 인덱스를 반환합니다.

code
ColumnIndex()    // Column 내부 인덱스 (0부터)
RowIndex()       // Row 내부 인덱스 (0부터)
DisplayColumn()  // Column 화면 표시 순서 (0부터)
DisplayRow()     // Row 화면 표시 순서 (0부터)

RowIndex vs DisplayRow: RowIndex는 내부 인덱스이고, DisplayRow는 노드 축소 등의 상태가 반영된 화면 표시 순서입니다.

GetRowFields / GetColumnFields / GetFields

현재 OLAP 배치를 기준으로 영역의 필드 목록을 반환합니다.

code
GetRowFields("제외할_필드목록")
GetColumnFields("제외할_필드목록")
GetFields("제외할_필드목록")

반환 타입: string

GetVariationValue

해당 셀의 특정 Measure 값으로 2차 계산의 값을 반환합니다.

code
GetVariationValue([FIELD_NAME])
GetVariationValue([FIELD_NAME], isVisible)

GetRecordValue / GetRecordCount

데이터 셀의 레코드 값 또는 레코드 수를 반환합니다.

code
GetRecordValue([FIELD_NAME])
GetRecordValue([FIELD_NAME], recordIndex)
GetRecordCount()

IsNullCell

해당 셀이 레코드가 없거나 모든 레코드의 값이 null인지 여부를 반환합니다.

code
IsNullCell()

반환 타입: bool

HasUpdateRow

현재 셀의 레코드 중 수정된 레코드가 존재하는지 여부를 반환합니다. (Write-Back시 사용)

code
HasUpdateRow()

반환 타입: bool

IMG

셀에 이미지를 표현합니다.

code
IMG("imagePath", width, height)

예제:

code
IF([Units] < 100000, IMG("red_circle.png", 16, 16), IMG("green_circle.png", 16, 16))

Array / DrawChart

셀 차트(SparkLine)를 그리기 위한 함수입니다.

code
Array(value1, value2, ..., valueN)
DrawChart(array, itemNames, lineWidth, pointSize, lineColor, pointColor, maxPointColor, minPointColor, pointType)
pointType설명
0None
1MinMax
2All
3BigSizeMinMax

4.6. 문자열 함수

함수원형설명
LeftLeft(source, nCount)좌측으로부터 n개 문자열
RightRight(source, nCount)우측으로부터 n개 문자열
LenLen(source)문자열 길이
LowerLower(source)소문자 변환
UpperUpper(source)대문자 변환
FindFind(source, findText, startIndex)문자열 검색 (없으면 -1)
Mid / SubstringMid(source, startIndex, nCount)부분 문자열
Replace / SubstituteReplace(source, oldText, newText)문자열 치환
TrimTrim(source)양쪽 공백 제거

4.7. 수학 함수

함수원형설명
ABSABS(value)절대값
ACOSACOS(value)아크코사인
ASINASIN(value)아크사인
ATANATAN(value)아크탄젠트
CEILCEIL(value)올림
COSCOS(value)코사인
EXPEXP(value)e의 거듭제곱
FLOORFLOOR(value)내림
LOGLOG(value)자연 로그
LOG10LOG10(value)상용 로그
RANDRAND(max)난수 (max 미지정 시 0~1)
ROUNDROUND(value, decimals)반올림
SINSIN(value)사인
TANTAN(value)탄젠트

4.8. 날짜/시간 함수

함수원형설명
NOWNOW()현재 날짜와 시간
TODAYTODAY()현재 날짜 (시간 00:00:00)
YEARYEAR(dateTime)년도
MONTHMONTH(dateTime)월 (1~12)
DAYDAY(dateTime)일 (1~31)
WEEKDAYWEEKDAY(dateTime)요일 (0=일~6=토)
HOURHOUR(dateTime)시 (0~23)
MINUTEMINUTE(dateTime)분 (0~59)
SECONDSECOND(dateTime)초 (0~59)
DATEDATE(year, month, day [, hour, minute, second])날짜 생성
DATEADDDATEADD(interval, addValue, dateTime)일자 가감
DATEDIFFDATEDIFF(interval, date1, date2)두 일자 차이
DATEPARTDATEPART(interval, dateTime)일자 파트 값

날짜 상수 (Interval): dtYear, dtMonth, dtDay, dtHour, dtMinute, dtSecond

예제:

code
DATEADD(dtYear, 1, DATE(2015, 04, 01))    // => 2016-04-01
DATEDIFF(dtMonth, DATE(2000, 04, 01), DATE(2015, 04, 01))  // => 180

5. 실전 수식 예제

5.1. 전체 대비 비율 계산

code
[판매수량] / ForAll("[COMPANY]", [판매수량]) * 100

5.2. 소계/총계 행 분기 처리

code
IF(IsTotalOrGrandTotal, "",
   [판매수량] / [목표수량] * 100
)

5.3. define을 활용한 복합 계산

code
define V_뉴욕판매수량 = IF([지역] == "뉴욕", [판매수량], 0)
define V_뉴욕_수량 = Sum(ForEach("[지역]", [V_뉴욕판매수량]))
IF([판매수량] == 0, 0, [V_뉴욕_수량] / [판매수량])

5.4. 전년 대비 증감률

code
IF(CellValueByOffset(0, -1) == 0, 0,
   (CELL_VALUE - CellValueByOffset(0, -1)) / CellValueByOffset(0, -1) * 100
)

5.5. 조건별 이미지 표시

code
IF([Units] < 100000,
   IMG("red_circle.png", 16, 16),
   IMG("green_circle.png", 16, 16)
)

5.6. 다중 조건 분기

code
CASE(
  FIELD_KEY == "revenue", [매출액] * 1.1,
  FIELD_KEY == "cost",    [원가] * 0.9,
  CELL_VALUE
)

5.7. 순위 계산

code
Rank("[Company]", "[Units]", true)

5.8. 셀 차트 (SparkLine)

code
DrawChart(
  Array([Q1_Units], [Q2_Units], [Q3_Units], [Q4_Units]),
  "Q1,Q2,Q3,Q4",
  1, 3,
  "#3366CC", "#3366CC", "#DC3912", "#109618",
  1
)