본문 바로가기

Analysis Services

계산 멤버로 LastNonEmpty 값 구하기

집계 함수 중 LastNonEmpty라는 집계 함수가 있다. 이것이 무엇인고하니 .. 다음과 같이 재고 데이터가 있는 경우를 생각해보자 :

 

 

 

재고량

2009

1

2

20,000

 

 

7

19,000


그럼 재고량을 표현할 때, 2009년 1월의 재고량은 얼마일까?

당연하지만 재고량은 가장 마지막 일자의 데이터를 기준으로 하게 된다. (마지막 일자 이후에 재고량의 변동이 없었다면 말이다) 이런 집계 패턴을 나타내기 위해 사용하는 것이 LastNonEmpty 집계 함수로써, 값이 있는(위 경우에는 '재고량'이 있는) 가장 마지막 멤버의 값을 상위의 멤버(=1월, 혹은 2009년)에 보여줄 수 있게 해 준다.

이것으로 끝난다면 좋겠으나 .. 다른 차원이 있을 경우에는?

 

 

 

재고량

재고량

 

 

 

제품A

제품B

2009

1

2

20,000

10,000

 

 

7

19,000

 

 

 

9

 

12,000


위 경우에는 문제가 없다. 1월 수준에서 제품A, 제품B의 재고량은 각각 19,200, 12,000 (마지막 값!)으로 나타날 것이다. 하지만 제품 수준에서 합산이 일어나면?

 

 

 

재고량

 

 

 

제품A+제품B

2009

1

2

30,000

 

 

7

19,000

 

 

9

12,000


이럴 경우에는 제품합 기준으로 12,000이 마지막 재고량으로 나타나게 된다. 이럴 경우에는 단순히 LastEmptyMember를 사용하면 안 되고, 기간 차원에 대해서만 마지막 멤버를 선택하도록 해야 한다. 이럴 경우에는 별도의 계산 멤버를 사용해서 다음과 같은 MDX 수식으로 LastNonEmpty 집계 함수와 비슷한 기능을 하게 할 수 있다 :

Tail(NonEmpty((PeriodsToDate([기간].[기간계층].[년],
ClosingPeriod([기간].[기간계층].[일])),
[Measures].[재고량]))).Item(0)
위 MDX는 기간 멤버에서만 마지막 멤버를 가져오므로, 다른 차원과 같이 쓰여도 정상적으로 집계를 수행할 수 있다.