MDX 스크립트

By 01/08/2018SSAS 강좌

MDX 스크립트

 

MDX 스크립트는 큐브를 통하여 다양한 관점의 다양한 수준에서 데이터 분석하기 위하여 분석 요구 조건에 따라 복잡한 규칙을계산 멤버나 별도의 추가적인 계산을 위한 MDX 표현식이나 구문들의 모음 입니다.

큐브의집계 작업 지정, 계산 멤버, 명명된 집합의 정의 등이 포함됩니다. 또한 큐브의 특정 부분에 대한 값 할당 처리 스크립트를 통해 특정한 셀의 값을 덮어 쓰거나색상과 같은 셀의 속성을 변경 할 수도 있습니다.

 

[CALCUATE]

CALCUATE는 큐브를 처리하는 시점에서 하위 수준에서 상위 수준으로 집계 작업을 수행할지 여부를 결정 합니다. 큐브 처리 작업시 집계 설계에 따라 집계한 데이터를 큐브에 저장합니다. 그러나CALCUATE를 생략하면 큐브처리를 하더라도 데이터를 상위 수준으로 집계하지 않고 데이터를 큐브에 초기 적재한상태로 남아 있습니다.

MDX 스크립트는 선언문적인 성격을 가져 MDX 스크립트 내에 정의된 모든 계산관련 로직이 큐브처리 시점에서 모두 계산되는 것이 아니라 조회를 하는 시점에 계산 됩니다. 즉, 계산 멤버나 값 할당 등의 작업이 모두 실시간으로 처리 됩니다.

 

[계산 순서 제어하기]

큐브에계산 멤버를 추가하면 계산 멤버의 순서대로 MDX 스크립트에 정의가 추가 됩니다. 이때 계산 멤버를 서로 다른 2개 이상의 차원에 정의하면 계산 멤버들이서로 교차하는 큐브 내의 셀에 대해서 어느 계산 멤버의 정의를 적용해야 하는가 하는 문제가 발생 합니다.

셀의계산 순서는 MDX 스크립트에 기술된 계산 멤버의 순서와 동일 합니다.계산순서를 바꾸려면 계산 멤버의 정의 위치를 바꾸면 됩니다.

CREATE MEMBER [ADVENTURE WORKS].[PRODUCT].[CATEGORY].[ALL PRODUCTS].[BIKES + CLOTHING]

AS [PRODUCT].[BIKES] + [PRODUCT].[CLOTHING];

 

CREATE MEMBER [ADVENTURE WORKS].[MEASURES].[AVG RESELLER SALES]

AS [MEASURES].[RESELLER SALES AMOUNT]/[MEASURES].[RESELLER ORDER QUANTITY],

FORMAT_STRING=”$#,#”;

 

 

SELECT

{[RESELLER SALES AMOUNT], [RESELLER ORDER QUANTITY],

[AVG RESELLER SALES]}ON COLUMNS,

{[PRODUCT].[CATEGORY].MEMBERS} ON ROWS

FROM

[ADVENTURE WORKS]

 

 

 

위와같이 두 개의 계산 멤버가 정의되어 있으면 먼저 Product 차원의[Bikes + Clothing]를 계산한 후 측정값 차원의 [Avg Reseller Sales]를계산합니다. 따라서 두 계산 멤버의 정의가 중첩되는 위치의 셀들은 최종적으로 [Bikes]와 [Clothing]의 더한 값을 이용하여 평균을 구한 [Avg Reseller Sales]의 값을 가지게 됩니다.

만약 [Avg Seller Sales]를 먼저 계산한 후 [Bikes +Clothing]를 계산하도록 원하면 간단히 두 계산 멤버의 정의 순서를 변경해 주면 됩니다.

 

[값할당]

큐브의특정 부분의 값을 집계된 값이 아닌 다른 비즈니스 로직에 따라 덮어써야 하는 경우가 있을때(CALCULATE 명령을통해 큐브의 집계가 일어난 후에 다른 적절한 값으로 덮어써야 할 경우) 사용합니다.

예를들어 Bikes 제품 카테고리에 속하는 모든 멤버들의 모든 측정값을NULL로 덮어쓸 수 있습니다.

SCOPE([MEASURES].MEMBERS);

DESCENDANTS([PRODUCT].[PRODUCT CATEGORIES].[CATEGORY].[BIKES]) = NULL;

END SCOPE;

 

MDX 스크립트에 위의 구문을 추가하면 Bikes 관련 제품들의 값이 보이지 않습니다. 주의할 점은SCOPE이 적용된 상위 레벨의 집계 값에서도 해당값들이 제외된다는 것입니다. 즉 [Bikes]의 부모 멤버인 [All Products]는 [Bikes]의 값이 제외된 집계값으로보입니다.

만약 [All Products]가 [Bikes]의 값도 포함된 원래의 집계값을보고자 한다면 다음과 같이 FREEZE를 활용할 수 있습니다.

SCOPE([MEASURES].MEMBERS);

FREEZE;

 

DESCENDANTS([PRODUCT].[PRODUCT CATEGORIES].[CATEGORY].[BIKES]) = NULL;

END SCOPE;

 

FREEZE에 의해서 [BIKES]의 상위 수준에 속하는 멤버의 값은 원래의 집계 값을반환 합니다.

 

2012-08-06 / 강성욱 / http://sqlmvp.kr / http://sqlangeles.com

 

SSAS, OLAP, 다차원모델링, BI, 큐브, MSBI, MSCUBE, SQLServer, mssql, 큐브만들기, BIDS, SSDT, MDX 스크립트, sqlmvp, sqlangeles

Leave a Reply

%d bloggers like this: