DAX - Calculate 함수 정리 2편

2021. 1. 8. 20:18엑셀/파워피벗 공부

728x90
반응형

지난 1편에 이어 Calculate 함수 2번째 포스팅입니다. 

1편에서 참고하는 동영상의 재생목록을 링크 했어야 하는데 첫 동영상만 링크가 걸려서 먼저 재생목록 링크 부터 다시 소개 합니다. 

youtube.com/playlist?list=PLU6II7MW-aiIees6mrPfdjt9c8noi7P66

 

CALCULATE in DAX - pills

Learn many details about the most important DAX function: CALCULATE!

www.youtube.com

 

이제 2편 입니다. 

2편에 앞서 1편의 이야기를 조금 더 이어가보죠. 첫번째 동영상을 보면 알 수 있지만 

Calculate 에 FILTER( ALL( fSales[고객유형] ) , fSales[고객유형] = "개인" ) 대신  fSales[고객유형] = "개인" 이렇게만 작성해도 결과는 동일합니다. Calculate 함수를 사용하면 자동으로 구성된다고 보면 되는데 제가 정리하기 편해서 해당 내용의 언급없이 그냥 진행 했네요. 

1. Calculate 와 Keepfilters 

이번에는 Keepfilters 함수를 Filter 함수 대신 넣어보겠습니다. 

Keepfilters의 MS Doc. 링크입니다. 역시나 무슨 의미인지 전혀 모르겠네요. 

docs.microsoft.com/ko-kr/dax/keepfilters-function-dax

 

KEEPFILTERS 함수(DAX) - DAX

KEEPFILTERSKEEPFILTERS 이 문서의 내용 --> CALCULATE 또는 CALCULATETABLE 함수를 평가하는 동안 필터가 적용되는 방식을 수정합니다.Modifies how filters are applied while evaluating a CALCULATE or CALCULATETABLE function. 구문S

docs.microsoft.com

데이터를 보는 것이 빠릅니다. 

측정값 "개인매출액"은 피벗테이블에서 적용되는 다른 '고객유형' 필드 '개인'이 아닌 다른 값이 오더라도 항상 개인매출액 값을 계산하여 출력합니다. 하지만 KEEPFILETS 함수를 사용하면 Calculate 에서 피벗테이블에서 적용된 필터 컨텍스트를 무시하는 것을 피해서 고객유형 필드값이 '개인'인 경우에만 값이 출력되도록 해줍니다. 

Calculate 함수가 함수 내부에서 측정값에 필터를 걸어서 산출하는 역할을 하고 동시에 함수 외부에서 적용되는 필터(예: 피벗테이블의 구성, 열과 행 항목에 구성된 필드들과 같이...)를 무시 하게 되는데 KEEPFILTERS 는 내부의 필터를 외부에서도 유지 해주는 역할을 한다고 풀이 할 수 있겠네요.  ㅜㅜ 정의가 참 어렵네요. 

일단 KEEPFILTERS를 사용하면 피벗 테이블에서 KEEPFILTERS에 지정된 기준과 일치하는 경우만 출력한다... 정도로 기억해야 겠습니다. 

보다 복잡한 측정값 작성이 필요한 경우 사용될 여지가 있겠지만 아직 저에게는 딱히 떠오르는 활용 예시가 없네요. 

!! 여기서 잠깐. SQLBI 에서 권장하는 Calculate 의 필터 적용 방식은

 "4번째 동영상에서 소개된 Table filter 는 성능상 좋지 않으니 field filter 를 사용해라" 

즉, Calculate 함수 내에 필터를 지정하여 측정값을 평가 할때 Table 전체를 필터로 하는 것보다 Table에 Field 를 지정해서 하는 것이 더 좋다는 의미로 볼 수 있겠네요. 당연한 말 같은데 어렵네요.. 

 

2. Calculate 와 ALL , Table filter & field filter

!! 여기서 잠깐. SQLBI 에서 권장하는 Calculate 의 필터 적용 방식은

 "4번째 동영상에서 소개된 Table filter 는 성능상 좋지 않으니 field filter 를 사용해라" 

즉, Calculate 함수 내에 필터를 지정하여 측정값을 평가 할때 Table 전체를 필터로 하는 것보다 Table에 Field 를 지정해서 하는 것이 더 좋다는 의미로 볼 수 있겠네요. 당연한 말 같은데 어렵네요.. 

먼저 Table filter , 즉 Field 를 지정하지 않고 Table 만 지정하여 ALL 함수로 필터를 적용해 보죠. 

먼저 "총 매출액" 측정값의 결과 입니다. 

"총 매출액"은 피벗테이블 구성과 관계없이 항상 매출액 총계를 출력합니다. 아래 처럼 슬라이서로 필터가 걸리더라도 매출액 총계 값이 유지가 되죠. 

슬라이서에 HL100, HL130이 2개 제품코드만 선택되었지만 여전히 "총 매출액"은 전체 총계를 유지 합니다. 

이번에는 field filter 차례입니다. 

위의 함수 식 중 2번째 "매장코드" 필드가 지정된 경우죠. 

Calculate 함수로 구성되지 않은 측정값 "매출액"과 동일한 결과가 나타나는데요. 여기서 매장코드 만 피벗테이블에 넣어보죠. 

ALL 함수로 무시할 대상이 테이블에 필드로 지정이 되면 해당 필드가 피벗테이블에 구성될 경우만 적용이 되고 그렇지 않은 경우에는 피벗테이블의 구성을 그대로 따라가게 되네요. 

이번에는 이 2가지 측정값을 가지고 비중을 표현하는 측정값을 각각 만들어보죠. 

Divide 함수를 사용합니다. 

매출액을 총 매출액으로 나눈 것으로 피벗테이블에 구성된 각 필드의 값 별로 매출액 비중을 알 수 있습니다. 

그런데 "매장코드" 필드에 필터가 걸린 두번째 경우는 어떨까요? 결과를 보겠습니다. 

보기 편하게 압축형태로 피벗 테이블 형식을 변환하였습니다. 

첫번째 "% 매출액" 은 쉽게 이해가 됩니다. 모든 필터를 무시한 매출액 합계로 나누었으니 피벗테이블이 어떤 모양이던지 항상 그 상태의 매출액 비중을 표현합니다. 

두번째는 현재 피벗테이블에 고객유형 하위로 매장코드가 구성되어 있고 매장코드를 무시하는 매출액 측정값으로 나누었기 때문에 의미상 고객유형별 매출액을 100%로 하는 고객유형의 매장별 매출액 구성비 가 됩니다. 

금액 측정값을 빼버리니 훨씬 보기 좋네요. 

!! 여기서 잠깐 

피벗테이블에서 비중을 표현하는 것은 굳이 파워피벗을 사용하지 않아도 가능합니다. 피벗 테이블의 필드 옵션으로 할 수 있습니다. 단 제약이 있습니다. 피벗 테이블에서 부분만 필터를 걸게되면 틀린 값이 출력된다는 것이죠. 

매출금액 필드를 값 영역에 넣고 "값 표시 형식>총합계 비율"로 설정해주면 됩니다. 

허나 필터를 걸게 되면 

현재 상태대로 비중을 표현합니다. 즉 이 '총합계 비율'에서 의미하는 총합계는 필터가 걸린 현 상태의 값들을 합계를 의마하는 것이죠. 하지만 측정값을 이용하면 이런 문제를 피할 수 있습니다. 

파워피벗_CALCULATE DAX 함수 2편.xlsx
0.16MB

 

2편 끝~~~ 

 

728x90
반응형