본문 바로가기
Power BI 글모음/Power BI DAX-M Query

DAX 의 핵심 개념 Row Context 와 Filter Context

by diary3790 2025. 1. 3.

DAX 식을 입력할 때는 먼저 그 결과 값의 형태를 선택해야 합니다. DAX의 결과 값은 세 가지 형태
즉, 1) 테이블 2) 측정값 3) 새 열 값 으로 반환됩니다. 

DAX 수식은 그 결과 값의 형태를 먼저 결정한 후 수식을 입력해야 한다.

이 때 '새 열'은 엑셀의 세로 열(Column) 같은 개념으로 기존의 테이블에 추가로 하나의 열이 계산되어 입력되는 형태입니다. 엑셀 표에서 새로운 열을 추가하는 것을 생각하면 쉽게 이해할 수 있습니다. '테이블'도 엑셀의 범위와 같은 형태로 복수의 열(1컬럼 열도 가능)인 전체 표(테이블)를 반환한다는 개념이기 때문에 엑셀과 크게 다르지 않습니다.

문제는 '측정 값'이란 형태의 결과 값인데 이는 엑셀 개념에서는 조금 이해하기 어려운 형태의 결과 값 입니다. 최대한 쉽게 설명하자면 측정값은 엑셀에서 함수를 직접 만드는 것과 같다고 생각하면 됩니다. 물론 함수를 만드는 것과는 조금 차이가 있지만 엑셀 함수의 정의가 결과 값이 인수(컨텍스트)에 따라 결정되는 계산 식이라고 하면 측정 값도 인수(컨텍스트)가 여러 형태로 입력되어 다른 결과 값이 반환되는 계산 식이기 때문에 유사한 개념이라고 이야기 할 수 있습니다.

측정 값의 이러한 형태 때문에 DAX에는 '컨텍스트' 라는 개념이 존재하게 됩니다. 이 컨텍스트라는 개념은 쉽게 함수의 인수 또는 계산 환경이라고 생각하면 됩니다. 작성해 놓은 측정값을 계산할 때 어떤 기준으로 실행할 것인지 정해주는 것이 이 컨텍스트 개념입니다. 

더보기

(보통 DAX에 대한 설명 자료를 보면 외국 자료를 그대로 인용하여 도입부 부터 다짜고짜 DAX에는 필터와 로우 컨텍스트라는 개념이 있고 이를 먼저 이해해야한다고 설명합니다. 그런데 이 컨텍스트라는 것은 사실 측정값의 계산 방법을 이해하기 위해 만든 개념에 지나지 않습니다. 그리고 DAX의 모든 계산 형태가 컨텍스트로 설명되는 것도 아니고 모든 수식에 컨텍스트가 존재하는 것은 아니기 때문에 그냥 그러한 개념이 있다 정도만 기억해 두시면 됩니다.)

Sales 테이블

매출액 합계 = SUM('Sales[매출액])

조금 더 쉽게 설명하면 아래 그림과 같이 피벗 테이블에서 특정 계산 값, 즉 '매출액 합계'를 특정'고객별'로 또는 특정 '제품별'로 또는 특정 날짜별로 각각 계산하여 볼 수 있는데 이 때의 특정 '고객', '제품', '날짜' 개념이 바로 측정값의 계산환경 즉, 컨텍스트라고 할 수 있습니다. 참고로 여기서는 해당 계산 값을 각각의 특정 레코드 값으로 필터해서 계산하기 때문에 이를 필터 컨텍스트라고 이야기합니다. 그리고 이러한 필터 컨텍스트는 보통 해당 측정값을 PBI의 캔버스에 삽입할 때 확정됩니다.

필터 컨텍스트는 캔버스에 측정값을 삽입할 때만 확정되는 것이 아니라 식 내부에서 처음부터 확정할 수 있습니다.

'가'고객의 매출액 = CALCULATE([매출액합계], 'Sales'[고객]= "가")

위 식은 계산 식 안에서 컨텍스트를 1차적으로 확정한 형태입니다. 즉 매출액을 계산할 때 '고객' 열 값이 "가"에 해당하는 컨텍스트에서만 매출액 값을 계산 하는 식 입니다. 물론 이 때에도 해당 측정 값의 최종 결과 값은 해당 측정값이 캔버스에 삽입될 때 다시한번 확정되게 됩니다. 이 때는 두개의 컨텍스트(내부 필터컨텍스트 & 외부 필터컨텍스트)에 의해서 계산 결과 값이 반환됩니다.

내&외부 필터 컨텍스트 계산 식 결과

위 결과 값은 '가' 고객의 매출액(내부 컨텍스트)을 제품 컨텍스트에 따라 표현한 값과 제품 컨텍스트에 따라만 표현된 매출액 값을 비교하는 테이블 입니다. '가'고객의 매출액은 두개의 컨텍스트 즉, '고객'열 값 '가'에 해당하는 값과 제품 컨텍스트 값으로 표현됩니다. (매출액 합계는 제품 컨텍스트로만 표현됩니다.)

필터 컨텍스트가(Filter Context) 보통 수식을 통해서 계산되는 범위를 제한하거나 결과값을 특정 기준으로 구분해서 보여주는 역할을 한다면 로우 컨텍스트(Low Context)는 보통 계산식을 행 단위로 반복해서 적용해야 하는 경우에 사용됩니다.

예를 들어 Sales 테이블에 매출액 값의 10% 할인 금액 열을 추가하기 위해서는 해당 테이블의 모든 행(필터링 된 특정 행이 아니라)의 매출액 값에 각각 0.1 을 곱하는 계산을 실행하고 그 결과 값을 각각의 행으로 추가해야 하는데 이 때 테이블의 각 행을 하나하나 반복하여 계산하는 것은 로우 컨텍스트에 의해서 실행됩니다. 다음은 '열 추가' 의 로우 컨텍스트로 각 매출액의 10% 할인 금액을 계산한 결과입니다. (기본적으로 '열 추가' 수식은 로우 컨텍스트 개념을 가지고 있습니다.)

로우 컨텍스트 개념을 포함하고 있는 열 추가 수식

따라서 로우 컨텍스트는 주로 테이블 함수(DAX 에서 ~X 가 붙은 함수는 모두 테이블 함수입니다.) 에서 사용되어 지며 특정 테이블의 모든 행에 순차적으로 특정 계산을 적용해야 할 때 사용 할 수 있습니다. 예를 들어 다음과 같이 각각의 매출액 값에 10% 할인 금액을 빼고 해당 금액을 다시 30% 할인하는 경우의 총 할인 값 합계를 구해야 하는 경우 (예제를 만들기 위해서 좀 억지 스러운 할인 방법을 만들어 보았습니다.) 손쉽게 로우 컨텍스트를 기본적으로 포함하고 있는 '열 추가' 방법으로 도 구할 수도 있고 테이블 함수인 SUMX 를 통해서도 구할 수 있습니다. 

'열 추가'의 로우 컨텍스트 개념을 이용한 더블 할인 계산

아래 수식은 테이블 함수(SUMX)를 활용해서 측정값 베이스로 Sales 테이블의 각 행 마다 30% 할인 금액을 계산 하고 이를 모두 더하는 수식을 구현 한 것입니다. 해당 수식의 결과 값은 다른 필터 컨택스트가 없다면 위에서 추가한 30%더블 할인 열의 합계금액 즉 = SUM('Sales[30%더블 할인]) 금액과 동일합니다.

30%더블 할인(측정값) =SUMX('Sales', ([매출액]-[10% 할인금액])*0.3)

DAX 의 컨텍스트 개념은 DAX 수식을 단순한 엑셀의 함수 수준에서 복잡한 수준의 SQL 문으로 업그레이드 시켜주는데 핵심적인 역할을 하는 개념입니다. 따라서 이를 잘 이해하면 복잡한 데이터 모델링도 손 쉽게 만들어 낼 수 있습니다. 하지만 이를 이해하지 못한다고 해서 DAX를 활용하는데 큰 어려움이 있냐? 그런건 또 아닙니다. 다만, 행 별로 하나씩 계산 하는 전처리가 필요한 경우(로우 컨텍스트) 또는 함수의 입력 또는 출력 값을 특정 기준으로 제한 하거나 (내부 필터 컨텍스트) 측정값의 스칼라 값을 특정 기준으로 구분하여 표현 하고자 하는 경우(외부 필터 컨텍스트)를 잘 구분하여 필요한 함수를 정확하게 사용할 수 있다면 꼭 컨텍스트라는 개념과 용어를 이해해야 하는 것은 아니기 때문에 지금 개념이 정확히 이해가 되지 않는다고 해서 좌절하거나 고민 하실 필요는 없습니다. 

다음은 위 예제를 담은 파일입니다.

컨텍스트개념설명_1.pbix
0.05MB

 

다음 시간에는 조금 더 쉽고 재미있는 함수의 활용에 대해서 학습하도록 하겠습니다.