컨텍스트를 사용하면 현재 행 또는 셀 선택과 관련 데이터를 반영하도록 수식의 결과를 변경할 수 있는 동적 분석을 수행할 수 있습니다. 컨텍스트를 이해하고 컨텍스트를 효과적으로 사용하는 것은 고성능 수식, 동적 분석을 구축하고 수식 문제를 해결하는 데 매우 중요합니다.
이 섹션에서는 행 컨텍스트, 쿼리 컨텍스트, 필터 컨텍스트 등 다양한 유형의 컨텍스트를 정의합니다. 계산된 열과 피벗 테이블의 수식에 대한 컨텍스트가 어떻게 평가되는지 설명합니다.
이 문서의 마지막 부분에서는 컨텍스트에 따라 수식의 결과가 어떻게 변경되는지 보여 주는 자세한 예제에 대한 링크를 제공합니다.
컨텍스트 이해
파워 피벗의 수식은 피벗 테이블에 적용된 필터, 테이블 간의 관계, 수식에 사용된 필터의 영향을 받을 수 있습니다. 컨텍스트는 동적 분석을 수행할 수 있게 해줍니다. 컨텍스트를 이해하는 것은 수식을 작성하고 문제를 해결하는 데 중요합니다.
행 컨텍스트, 쿼리 컨텍스트, 필터 컨텍스트 등 다양한 유형의 컨텍스트가 있습니다.
행 컨텍스트는 "현재 행"으로 생각할 수 있습니다. 계산된 열을 만든 경우 행 컨텍스트는 각 개별 행의 값과 현재 행과 관련된 열의 값으로 구성됩니다. 현재 행에서 값을 가져온 다음 전체 테이블에서 작업을 수행하는 동안 해당 값을 사용하는 함수(EARLIER 및 EARLIEST)도 있습니다.
쿼리 컨텍스트는 행 및 열 머리글에 따라 피벗 테이블의 각 셀에 대해 암시적으로 만들어지는 데이터의 하위 집합을 나타냅니다.
필터 컨텍스트는 행에 적용되었거나 수식 내의 필터 식에 의해 정의된 필터 제약 조건을 기반으로 각 열에 허용되는 값의 집합입니다.
행 컨텍스트
계산된 열에서 수식을 만드는 경우 해당 수식의 행 컨텍스트에는 현재 행에 있는 모든 열의 값이 포함됩니다. 테이블이 다른 테이블과 관련된 경우 콘텐츠에는 현재 행과 관련된 다른 테이블의 모든 값도 포함됩니다.
예를 들어 같은 테이블의 두 열을 합산하는 계산된 열 =[Freight] + [Tax]를 만든다고 가정해 보겠습니다. 이 수식은 같은 행의 값을 자동으로 참조하는 Excel 표의 수식처럼 작동합니다. 테이블은 범위와 다릅니다. 범위 표기법을 사용하여 현재 행 앞의 행에서 값을 참조할 수 없으며 테이블이나 셀에서 임의의 단일 값을 참조할 수 없습니다. 항상 테이블과 열을 사용해야 합니다.
행 컨텍스트는 테이블 간의 관계를 자동으로 따라 관련 테이블에서 현재 행과 연결된 행을 결정합니다.
예를 들어 다음 수식은 RELATED 함수를 사용하여 주문이 배송된 지역을 기준으로 관련 테이블에서 세금 값을 가져옵니다. 세액은 현재 테이블에서 지역에 대한 값을 사용하고 관련 테이블에서 지역을 조회한 다음 관련 테이블에서 해당 지역의 세율을 가져와서 결정됩니다.
= [Freight] + RELATED('Region'[TaxRate])
이 수식은 단순히 Region 테이블에서 현재 지역의 세율을 가져옵니다. 테이블을 연결하는 키를 알거나 지정할 필요가 없습니다.
여러 행 컨텍스트
또한 DAX에는 테이블에 대한 계산을 반복하는 함수가 포함되어 있습니다. 이러한 함수는 여러 개의 현재 행과 현재 행 컨텍스트를 가질 수 있습니다. 프로그래밍 용어로 내부 및 외부 루프를 반복하는 수식을 만들 수 있습니다.
예를 들어 통합 문서에 Products 테이블과 Sales 테이블이 포함되어 있다고 가정해 보겠습니다. 여러 제품과 관련된 트랜잭션으로 가득 찬 전체 판매 테이블을 살펴보고 하나의 트랜잭션에서 각 제품에 대해 가장 많이 주문된 수량을 찾을 수 있습니다.
Excel에서 이 계산에는 일련의 중간 요약이 필요하며, 데이터가 변경되면 다시 작성해야 합니다. Excel의 고급 사용자인 경우 작업을 수행하는 배열 수식을 작성할 수 있습니다. 또는 관계형 데이터베이스에서 중첩된 하위 선택을 작성할 수 있습니다.
그러나 DAX를 사용하면 올바른 값을 반환하는 단일 수식을 작성할 수 있으며, 테이블에 데이터를 추가할 때마다 결과가 자동으로 업데이트됩니다.
=MAXX(FILTER(Sales,[ProdKey]=EARLIER([ProdKey])),Sales[OrderQty])
이 수식에 대한 자세한 내용은 EARLIER 함수를 참조하세요.
간단히 말해서, EARLIER 함수는 현재 작업 이전의 작업의 행 컨텍스트를 저장합니다. 함수는 항상 두 가지 컨텍스트 집합을 메모리에 저장합니다. 한 컨텍스트 집합은 수식의 내부 루프에 대한 현재 행을 나타내고 다른 컨텍스트 집합은 수식의 외부 루프에 대한 현재 행을 나타냅니다. DAX는 복잡한 집계를 만들 수 있도록 두 루프 사이에 값을 자동으로 공급합니다.
쿼리 컨텍스트
쿼리 컨텍스트는 수식에 대해 암시적으로 검색되는 데이터의 하위 집합을 나타냅니다. 측정값 또는 기타 값 필드를 피벗 테이블의 셀에 놓으면 파워 피벗 엔진이 행 및 열 머리글, 슬라이서 및 보고서 필터를 검사하여 컨텍스트를 결정합니다. 그런 다음 Power Pivot은 피벗 테이블의 각 셀을 채우는 데 필요한 계산을 수행합니다. 검색되는 데이터 집합은 각 셀에 대한 쿼리 컨텍스트입니다.
수식을 배치하는 위치에 따라 컨텍스트가 달라질 수 있으므로 여러 그룹화와 필터가 있는 피벗 테이블에서 수식을 사용하는지, 아니면 필터가 없고 컨텍스트가 최소화된 계산된 열에서 수식을 사용하는지에 따라 수식의 결과도 달라집니다.
예를 들어 Sales 테이블의 Profit 열 값을 합산하는 간단한 수식을 만들었다고 가정해 보겠습니다.
=SUM('Sales'[Profit])
Sales 테이블 내의 계산 열에서 이 수식을 사용하는 경우 수식에 대한 쿼리 컨텍스트는 항상 Sales 테이블의 전체 데이터 집합이므로 수식의 결과는 전체 테이블에 대해 동일합니다. 귀하의 결과는 모든 지역, 모든 제품, 모든 연도 등에 대해 수익이 있습니다.
그러나 일반적으로 동일한 결과를 수백 번 보고 싶지 않고, 대신 특정 연도, 특정 국가 또는 지역, 특정 제품 또는 이러한 조합에 대한 수익을 얻은 다음 총계를 얻으려고 합니다.
피벗 테이블에서 열 및 행 머리글을 추가 또는 제거하고 슬라이서를 추가 또는 제거하여 컨텍스트를 쉽게 변경할 수 있습니다. 측정값에 위와 같은 수식을 만든 다음 피벗 테이블에 놓을 수 있습니다. 피벗 테이블에 열 또는 행 머리글을 추가할 때마다 측정값이 계산되는 쿼리 컨텍스트가 변경됩니다. 분할 및 필터링 작업도 컨텍스트에 영향을 줍니다. 따라서 피벗 테이블에 사용되는 동일한 수식이 각 셀에 대해 다른 쿼리 컨텍스트에서 계산됩니다.
필터 컨텍스트
필터 컨텍스트는 수식에 인수를 사용하여 열 또는 테이블에 허용되는 값 집합에 대한 필터 제약 조건을 지정하면 추가됩니다. 필터 컨텍스트는 행 컨텍스트나 쿼리 컨텍스트 같은 다른 컨텍스트 위에 적용됩니다.
예를 들어 피벗 테이블은 앞의 쿼리 컨텍스트 섹션에서 설명한 대로 행과 열 머리글을 기반으로 각 셀에 대한 값을 계산합니다. 그러나 피벗 테이블에 추가하는 측정값 또는 계산된 열 내에서 필터 식을 지정하여 수식에서 사용되는 값을 제어할 수 있습니다. 특정 열에서 필터를 선택적으로 지울 수도 있습니다.
수식 내에 필터를 만드는 방법에 대한 자세한 내용은 필터 함수를 참조하세요.
필터를 지워 총합계를 만드는 방법에 대한 예제는 ALL 함수를 참조하세요.
수식에서 필터를 선택적으로 지우고 적용하는 방법에 대한 예제는 ALLEXCEPT 함수를 참조하세요.
따라서 수식 결과를 해석할 때 필터 컨텍스트를 인식할 수 있도록 피벗 테이블에서 사용되는 측정값 또는 수식의 정의를 검토해야 합니다.
수식의 컨텍스트 확인
수식을 만들 때 Excel용 파워 피벗은 먼저 일반 구문을 검사한 다음, 사용자가 제공하는 열 및 테이블의 이름을 현재 컨텍스트에서 가능한 열 및 테이블과 비교하여 확인합니다. 파워 피벗에서 수식으로 지정된 열과 테이블을 찾을 수 없는 경우 오류가 발생합니다.
컨텍스트는 통합 문서에서 사용 가능한 테이블, 테이블 간의 관계 및 적용된 필터를 사용하여 이전 섹션에서 설명한 대로 결정됩니다.
예를 들어 일부 데이터를 새 테이블로 방금 가져왔는데 필터를 적용하지 않은 경우 테이블의 전체 열 집합이 현재 컨텍스트의 일부가 됩니다. 관계로 연결된 테이블이 여러 개 있고 열 머리글을 추가하고 슬라이서를 사용하여 필터링된 피벗 테이블에서 작업하는 경우 컨텍스트에는 관련 테이블과 데이터에 대한 필터가 포함됩니다.
컨텍스트는 수식 문제 해결을 어렵게 만드는 강력한 개념입니다. 간단한 수식과 관계로 시작하여 컨텍스트가 어떻게 작동하는지 확인한 다음 피벗 테이블에서 간단한 수식을 실험해 보는 것이 좋습니다. 다음 섹션에서는 수식에서 다양한 유형의 컨텍스트를 사용하여 결과를 동적으로 반환하는 방법에 대한 몇 가지 예제도 제공합니다.
수식의 컨텍스트 예시
- RELATED 함수는 관련 열의 값을 포함하도록 현재 행의 컨텍스트를 확장합니다. 이렇게 하면 조회를 수행할 수 있습니다. 이 항목의 예제에서는 필터링과 행 컨텍스트의 상호 작용을 보여 줍니다.
- FILTER 함수를 사용하면 현재 컨텍스트에 포함할 행을 지정할 수 있습니다. 또한 이 항목의 예제에서는 집계를 수행하는 다른 함수 내에 필터를 포함하는 방법을 보여 줍니다.
- ALL 함수는 수식 내의 컨텍스트를 설정합니다. 쿼리 컨텍스트의 결과로 적용되는 필터를 재정의하는 데 사용할 수 있습니다.
- ALLEXCEPT 함수를 사용하면 지정한 필터를 제외한 모든 필터를 제거할 수 있습니다. 두 topics 모두 수식을 작성하고 복잡한 컨텍스트를 이해하는 과정을 안내하는 예제를 포함합니다.
- EARLIER 및 EARLIEST 함수를 사용하면 내부 루프에서 값을 참조하면서 계산을 수행하여 테이블을 반복할 수 있습니다. 재귀의 개념과 내부 및 외부 루프에 익숙하다면 EARLIER 및 EARLIEST 함수가 제공하는 기능을 높이 평가할 것입니다. 이러한 개념을 처음 사용하는 경우 예제의 단계를 주의 깊게 수행하여 내부 및 외부 컨텍스트가 계산에 사용되는 방식을 확인해야 합니다.
참조 무결성
이 섹션에서는 관계로 연결된 파워 피벗 테이블의 누락된 값과 관련된 몇 가지 고급 개념을 설명합니다. 이 섹션은 여러 표와 복잡한 수식이 있는 통합 문서가 있고 결과를 이해하는 데 도움이 필요한 경우에 유용할 수 있습니다.
관계형 데이터 개념을 처음 접하는 경우 먼저 소개 항목인 관계 개요를 읽는 것이 좋습니다.
참조 무결성 및 파워 피벗 관계
파워 피벗에서는 유효한 관계를 정의하기 위해 두 테이블 간에 참조 무결성을 적용할 필요가 없습니다. 대신, 각 일대다 관계의 "일대다" 끝에 빈 행이 만들어지고 관련 테이블에서 일치하지 않는 모든 행을 처리하는 데 사용됩니다. 이는 사실상 SQL 외부 조인으로 작동합니다.
피벗 테이블에서 관계의 한쪽을 기준으로 데이터를 그룹화하면 관계의 다쪽에서 일치하지 않는 데이터는 함께 그룹화되고 빈 행 머리글이 있는 합계에 포함됩니다. 빈 머리글은 "알 수 없는 멤버"와 거의 동일합니다.
알 수 없는 멤버 이해
알 수 없는 멤버의 개념은 SQL Server Analysis Services와 같은 다차원 데이터베이스 시스템을 사용해 본 적이 있다면 아마 익숙할 것입니다. 용어가 생소한 경우 다음 예제에서 알 수 없는 멤버가 무엇이며 계산에 미치는 영향을 설명합니다.
각 매장의 월별 판매액을 합산하는 계산을 만들고 있는데 판매 테이블의 열에 매장 이름 값이 없다고 가정해 보겠습니다. Store 및 Sales에 대한 테이블이 매장 이름으로 연결되어 있다고 가정할 때 수식에서 어떤 일이 발생할 것으로 예상할까요? 피벗 테이블은 기존 매장과 관련이 없는 판매액 수치를 어떻게 그룹화하거나 표시해야 하나요?
이 문제는 팩트 데이터의 큰 테이블이 팩트 분류 및 계산에 사용되는 저장소, 지역 및 기타 속성에 대한 정보가 포함된 차원 테이블과 논리적으로 관련되어야 하는 데이터 웨어하우스에서 일반적으로 발생하는 문제입니다. 문제를 resolve 위해 기존 엔터티와 관련이 없는 모든 새 팩트가 알 수 없는 멤버에 일시적으로 할당됩니다. 이 때문에 관련이 없는 팩트가 피벗 테이블의 빈 머리글 아래에 그룹화되어 표시됩니다.
빈 값과 빈 행의 처리 비교
빈 값은 알 수 없는 멤버를 수용하기 위해 추가된 빈 행과 다릅니다. 빈 값은 null, 빈 문자열 및 기타 누락된 값을 나타내는 데 사용되는 특수 값입니다. 빈 값 및 다른 DAX 데이터 형식에 대한 자세한 내용은 데이터 모델의 데이터 형식을 참조하세요.