2017-01-30 2 views
0

나는 주문 위치와 해당 주문 번호를 포함하는 사실 표가 있습니다. 약 250 mio 행이 있습니다.테이블 형 모델의 DAX가 포함 된 자체 필터링 테이블

내 목표는 다음 질문에 대답하는 데 사용할 수있는 측정 값을 만드는 것입니다. 제품 xyz가 포함 된 모든 주문의 총 수익은 얼마입니까?

하나의 열 OrderFilter [ArticleNr] 만있는 Orderfilter라는 모든 개별 아티클 번호가 포함 된 표를 추가했습니다. 이 테이블은 orders 테이블을 필터링하는 데 사용됩니다. 이 테이블은 orders 테이블과 관련이 없습니다.

이 설정을 기반으로 다음과 같은 조치를 취했습니다.

Orderfilter Sum sales:=SUMX(
CALCULATETABLE (
    Orders; 
    FILTER (
     Orders; 
     CONTAINS (
      CALCULATETABLE (
       VALUES(Orders[OrderNr]); 
       FILTER (
        Orders; 
        CONTAINS (
         VALUES (Orderfilter[ArticleNr]); 
         Orderfilter[ArticleNr]; 
         Orders[ArticleNr] 
        ) 
       ) 
      ); 
      Orders[OrderNr]; 
      Orders[OrderNr] 
     ) 
    ) 
); 
Orders[Salesamount] 
) 

이 계산은 효과가있는 것처럼 보일 수 있지만 매우 느립니다. Excel에서 계층 구조를 행에 넣어 사용하려고하면 시간이 초과됩니다.

이 쿼리를 튜닝 할 수 있습니까?

감사합니다, 헤닝 랭

업데이트 : 원하는 결과 테이블

주문 테이블 (정말 ... 여기에 테이블을 추가하는 방법을 모른다). ArticleNr = 2로 필터링하면 "< - 유지"가 유지됩니다.

|OrderNr  |ArticleNr |  
|1   |1   | <- Keep  
|1   |***2*** | <- Keep  
|2   |1   |  
|2   |3   |  
|3   |***2*** | <- Keep 
+1

왜 두 테이블간에 관계를 만들지 않습니까? ** FILTER **에서 ** CONTAINS ** 기능을 사용하는 것보다 더 효과적입니다. 명시 적 관계는 항상 필터보다 빠릅니다. –

+0

안녕하세요, 빠른 답변을 보내 주셔서 감사합니다. 나는 관계가이 문제에 도움이되지 않을 것이라고 생각합니다. 내가 그 테이블들 사이에 관계를 만들면 Orders [ArticleNr]와 Orderfilter [ArticleNr]을 관련 짓습니다. 이 방법은 Orders 테이블을 ArticleNr을 기반으로 필터링합니다. 그러나 그것은 내가 성취하고자하는 것이 아닙니다. OrderNr을 기반으로 Orders 테이블을 필터링하려고합니다. "x, y 또는 z 기사가 들어있는 모든 주문의 판매가 무엇입니까?" 당신의 제안으로 나는 "기사 x, y 또는 z의 판매는 무엇입니까?"라는 질문에 대답 할 수 있습니다. 또는 나는이 가정에서 잘못 되었습니까? –

+0

원본에서 처리 할 수 ​​있습니다. 즉, Orders 및 Orderfilter 테이블에 공통 열을 만듭니다. 샘플 데이터와 예상 결과를 포함하도록 질문을 편집하십시오. –

답변

0

이 방법은 ArticleNr 중 하나를 선택하는 경우에만 작동합니다. 내가 MAX() 함수를 사용하여 필터에서 선택된 값이 무엇인지 결정할 수 있기 때문에 최대 값 ArticleNr이 항상 반환됩니다.

: 행을 결정하기 위해 조치를 작성

주문 표

OrderNr ArticleNr Revenue 
    1   1  100 
    1   2  200 
    2   1   50 
    2   3   70 
    3   2  300 
    3   4  200 
    4   1   50 

기사

ArticleNr 
    1 
    2 
    3 

:

이 샘플 데이터를 고려

이제 Sum Sales 얻을 Rows 측정을 사용하여 다음을 수행 할 수 있습니다

Sum Sales := 
SUMX (
    FILTER (Orders, SUMX (ALLEXCEPT (Orders, Orders[OrderNr]), [Rows]) = 1), 
    [Revenue] 
) 

이 파워 피벗에서 피벗 테이블입니다.

enter image description here

이 도움이된다면 알려주세요.

+0

안녕하세요, 위대한 작품입니다! 이 질문에 얼마나 많은 노력을 기울 였는지 놀랍습니다. 결국 나는 하나의 기사 만 필터링 할 수있는 기회에 만족하지 않았습니다. 나는 여기에 여러 ArticleNrs 함께 작동하는 또 다른 해결책을 찾았 : http://blog.gbrueckl.at/2012/05/resolving-many-to-many-relationships-leveraging-dax-cross-table-filtering/ –

0

Excel에서 계층을 사용할 때 속도가 느린 경우 계층 구조가 문제가됩니다. 아마도 부자연 스럽습니다. Excel은 어떤 엔진이 사용되는지에 관계없이 MDX 쿼리를 SSAS로 보냅니다 (표/multidim). 그리고 부 자연스러운 위계 질서에 관해서는 일이 잘못됩니다.

자연 계층을 구축하고 확인하십시오. 날짜를 Dim으로 취하십시오. 날짜, 월, 연도가 있습니다. 1 월 - 12 월을 단순히 월 열에 넣으면 고유하지 않습니다. 명시 적으로 hierarhy 회원을 지정하십시오. 이 경우처럼 1 월 - 2016 년 등의 달 열에 연도를 넣으십시오. 따라서 매달마다 고유 할 것이므로 엔진은 드릴 다운 할 때 어떤 멤버가 필요하지 않습니다.