2015-01-20 4 views
0

복잡한 MDX 계산 방법 질문이 있습니다. 나는 두 개의 측정 값과 Hour-Minute 계층 구조를 가지고있다. 매시간 수준에서 MeasureA는 기본 분 값의 최대 값까지 롤업합니다. MeasureB는 MeasureA에서 Max의 해당 값으로 롤업해야합니다. 아래 예에서 8은 Max of MeasureA입니다. 따라서 MeasureB는 매시간 최대 2 롤을해야합니다. MeasureB 계산에 문제가 있습니다. MDX 계산 된 측정 값에서이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 위 외에도SSAS MDX의 다른 측정 값을 기반으로 측정 값을 검색하려면 어떻게합니까?

MeasureA   Measure B 
Hour   8   2 
    Minute1 2   3 
    Minute2 1   2 
    Minute3 5   1 
    Minute4 6   3 
    Minute5 8   2 

는 .... 나는 두 개의 계층 구조 "년 - 월 - 일"과 "시 - 분"을 가지고있다. 이것은 Hour-Minute hierachy에서 완벽하게 작동합니다. 그러나, 같은 논리가 별도의 계층에 있더라도 시간별로 롤업하기를 원할 때. 나는 아래의 작업 시간/분 키와 비 작동 일 키에 대한 코드를 가지고있다. 제가 잘못하고있는 것을 보았습니까?

측정 A는 = "평균 사용 자료"와 B = "총 리소스"를 측정

// Total  Resources Calculation 
---Initializing keys 
CREATE MEMBER CURRENTCUBE.[Measures].[Avg Used Resources Key Minutes] 
AS null, 
VISIBLE = 1, ASSOCIATED_MEASURE_GROUP = 'NSS Resource Utilization'; 

CREATE MEMBER CURRENTCUBE.[Measures].[Avg Used Resources Key Hours] 
AS null, 
VISIBLE = 1, ASSOCIATED_MEASURE_GROUP = 'NSS Resource Utilization'; 

CREATE MEMBER CURRENTCUBE.[Measures].[Avg Used Resources Key Days] 
AS null, 
VISIBLE = 1, ASSOCIATED_MEASURE_GROUP = 'NSS Resource Utilization'; 
--- 

-- Minute Key 
SCOPE ([Time].[Hour-Minute].[Time Name],[Measures].[Avg Used Resources Key  Minutes]); 
THIS = IIF(([Time].[Hour-Minute].CurrentMember,[Measures].[Avg Used Resources]) 
        = ([Time].[Hour-Minute].CurrentMember.Parent,[Measures]. [Avg Used Resources]) 
, [Time].[Hour-Minute].CurrentMember.Member_Key, null); 
END SCOPE; 

-- Hour Key 
SCOPE ([Measures].[Avg Used Resources Key Hours]); 
THIS = MAX([Time].[Hour-Minute].CurrentMember.Children,[Measures].[Avg Used  Resources Key Minutes]); 
END SCOPE; 

-- Day Key 
SCOPE ([Measures].[Avg Used Resources Key Days]); 
THIS = IIF(([Time].[Hour-Minute].CurrentMember,[Measures].[Avg Used Resources]) 
         = ([Time].[Hour-Minute].CurrentMember.Parent, [Measures].[Avg Used Resources]) 
, [Time].[Hour-Minute].CurrentMember.Member_Key, null); 
END SCOPE; 

-- Hour Value 
SCOPE ([Time].[Hour-Minute].[Hour 24],[Measures].[Total Resources]); 
THIS = (StrToMember("[Time].[Hour-Minute].[Time Name].&["+CStr([Measures]. [Avg Used Resources Key Hours])+"]") 
,[Measures].[Total Resources]); 
END SCOPE; 

--Date Value 
SCOPE ([Time].[Hour-Minute].[ALL],[Measures].[Total Resources]); 
THIS = (StrToMember("[Time].[Hour-Minute].[Hour 24].&["+CStr([Measures].[Avg  Used Resources Key Days])+"]") 
,[Measures].[Total Resources]); 
END SCOPE; 
+1

귀하의 질문에 답변 할 수 없습니다. 큐브 구조를 공유하고 코드에 대한 현재 측정 값과 이에 대한 분석을 공유하십시오. – SouravA

답변

0

내가 아주 바보 같은 솔루션을 가지고 있지만 작동! 주요 아이디어는 필요한 분을 시간 단위로 전송하는 것입니다. 를 계산하는 범위를 추가보다

CREATE MEMBER CURRENTCUBE.[Measures].[Measure A Key Minutes] 
AS null, 
VISIBLE = 0; 
CREATE MEMBER CURRENTCUBE.[Measures].[Measure A Key Hours] 
AS null, 
VISIBLE = 0; 

:

SCOPE ([Date].[Date].[Minutes],[Measures].[Measure A Key Minutes]); 
THIS = IIF(([Date].[Date].CurrentMember,[Measures].[Measure A]) = ([Date].[Date].CurrentMember.Parent,[Measures].[Measure A]) 
, [Date].[Date].CurrentMember.Member_Key, null); 
END SCOPE; 
SCOPE ([Measures].[Measure A Key Hours]); 
THIS = MAX([Date].[Date].CurrentMember.Children,[Measures].[Measure A Key Minutes]); 
END SCOPE; 

먼저 범위는 새로운 측정의 경우 값에 구성원의 키를두고

최대 분 값의 키를 저장하기위한 추가 빈 조치를 만들기 분 수준의 시간은 시간 수준과 같습니다. 두 번째 값은이 값을 시간 단위로 이동시킵니다. 이제 우리는 시간 단위로 최대 분 값의 키를 가지고 있습니다.

그리고 측정 B를 업데이트하는 마지막 범위를 추가하는 것보다

:

SCOPE ([Date].[Date].[Hours],[Measures].[Measure B]); 
THIS = (StrToMember("[Date].[Date].&["+CStr([Measures].[Measure A Key Hours])+"]") 
,[Measures].[Measure B]); 
END SCOPE; 

그것은 큰 치수 (서버가 확실히 셀 별 모드로 전환됩니다!)가, 단단하고 엄격한입니다하지만 절대적으로 느린 솔루션입니다. .. 작동합니다. 방금 테스트되었습니다.

모든 추가 사항 속도 향상 방법을 환영합니다. 그러나 다른 방법을 사용하는 것이 좋습니다.

업데이트 : (버그로 인해 수정 됨) 불행히도 새로운 레벨을 추가하는 쉬운 방법은 없습니다. 하지만 다음과 같이 할 수 있습니다.

  1. 새로운 HOUR-DAY 관계에 대해 다른 두 가지 측정 값을 더합니다.
  2. 먼저 각 HOUR 멤버의 가장 높은 키를 찾습니다.
  3. 두 번째로 DAY 레벨로 이동합니다.
  4. StrToMember를 사용하여 범위를 다시 추가하십시오 (단 일 동안).

불행히도, 이것은 하나의 해결책입니다.

첫 번째 측정 값은 "Minute Key on Minutes Level"과 같으며 두 번째 값은 "Minute Key on Hours Level"입니다. "Hour Key On Hours"및 "Hour Key on Days Level"과 같은 요일 범위 및 요일 수준의 다른 범위와 같은 측정 값을 추가해야합니다.

CREATE MEMBER CURRENTCUBE.[Measures].[Measure A Key Hour - Hour Level] 
AS null, 
VISIBLE = 0; 
CREATE MEMBER CURRENTCUBE.[Measures].[Measure A Key Hour - Day Level] 
AS null, 
VISIBLE = 0; 

SCOPE ([Date].[Date].[Hour],[Measures].[Measure A Key Hour - Hour Level]); 
THIS = IIF(([Date].[Date].CurrentMember,[Measures].[Measure A]) = ([Date].[Date].CurrentMember.Parent,[Measures].[Measure A]) 
, [Date].[Date].CurrentMember.Member_Key, null); 
END SCOPE; 

SCOPE ([Date].[Date].[Day],[Measures].[Measure A Key Hour - Day Level]); 
THIS = MAX([Date].[Date].CurrentMember.Children,[Measures].[Measure A Key Hour - Hour Level]); 
END SCOPE; 

SCOPE ([Date].[Date].[Day],[Measures].[Measure B]); 
THIS = (StrToMember("[Date].[Date].&["+CStr([Measures].[Measure A Key Hour - Day Level])+"]") 
,[Measures].[Measure B]); 
END SCOPE; 

나는 첫 번째 측정 값이 매 시간마다 MAX의 논리를 사용한다고 생각합니다.

+0

이것은 정말 대단합니다. 고마워요! 이것을 대책과 계층 구조에 적용 해 보았습니다. 제 큐브가 너무 작아서 셀 단위 모드가 문제가되지 않습니다. –

+0

당신은 환영합니다, Jay, 행운을 빈다! –

+0

안녕하세요, Alex는 두 해의 계층을 "Year-Month-Day"와 "Hour-Minute"라고합니다. 이것은 Hour-Minute hierachy에서 완벽하게 작동합니다. 그러나, 같은 논리가 별도의 계층에 있더라도 시간별로 롤업하기를 원할 때. 나는 아래의 작업 시간/분 키와 비 작동 일 키에 대한 코드를 가지고있다. 제가 잘못하고있는 것을 보았습니까? –

관련 문제