2009-02-04 2 views
0

저는 MDX를 처음 접했기 때문에 이것은 초보자 용 질문이라고 생각합니다.MDX : 존재하지 않는 구성원을 필터링 하시겠습니까?

기존 치수 : 상태 기존의 측정 : 나는 상태 = 'C'로 레코드를 계산합니다

SELECT 
    NON EMPTY [status].CHILDREN ON 0, 
    NON EMPTY Measures.count ON 1 
FROM [objects] 

:

기존 쿼리 수입니다. 그러나 때로는 그 기준과 일치하는 기록이 없습니다. 그래서 만약 내가 할 :

SELECT 
    NON EMPTY [status].[C] ON 0, 
    NON EMPTY Measures.count ON 1 
FROM [objects] 

내가이 오류 :

*MDX object '[status].[C]' not found in cube 'objects'* 

나는 경우에 0을 반환하는 쿼리를하고 싶습니다. 이 쿼리를 수행하는 올바른 방법은 무엇입니까?

감사합니다.

답변

2

대부분의 클라이언트 응용 프로그램에서 가장 좋은 아이디어는 메타 데이터를 쿼리하여 차원에있는 멤버를 찾은 다음 존재하는 멤버에 대해서만 쿼리를 발급하는 것입니다.

다음 문서는 차원 메타 데이터 link text

에서 얻을 수있는 다양한 방법을 나열는 "해킹"다음을 수행하기 위해 다른 수 있습니다 :

SELECT 
    NON EMPTY StrToSet("[status].[C]") ON 0, 
    NON EMPTY Measures.count ON 1 
FROM [objects] 

을하지만 여전히 당신에게 공을주지 않을 것이다, 대신 열이없는 셀 집합을 제공합니다. 그리고 제가 권장할만한 접근법이 아닙니다.

2

나는 귀하의 데이터 소스에 Status 차원 테이블이 실제로 없다고 가정합니다. 대신 팩트 테이블의 열을 사용하는 차원이 정의되어 있습니다. 이것은 훌륭하게 작동하지만 그 차원에 대한 고정 된 멤버 집합을 정의 할 수는 없습니다 ... 기본적으로 여러분은 가지고있는 사실을 고수하고 있습니다.

해결책은 DimStatus라는 별도의 테이블을 만들고 사실에 의해 사용 된 모든 유효한 상태로 미리 채우고 팩트 테이블에서 상태를 참조하도록하는 것입니다 치수 표.

그런 다음 원하는대로 작동합니다. 사용하지 않는 멤버를 자동으로 숨길 수도 있고, 모두 포함시킬 수도 있고, 원하는 멤버 만 포함 할 수도 있습니다.

일치하는 사실이 없으면 0 대신에 (null)이 표시된다는 경고가 하나 있습니다. 당신은 간단한 IIF (IsEmpty 함수())와 함께이 문제를 해결 얻을 수 있습니다 :이 모든 상태 및 중 하나를 수, 또는 0을 표시합니다

WITH MEMBER 
    [ZeroCount] AS 
     IIF(ISEMPTY([Measures].[Count]), 0, [Measures].[Count]) 
SELECT [ZeroCount] ON COLUMNS, 
[Status].Members on ROWS 
FROM [MyCube] 

. 불행히도 데이터 소스 및 큐브를 변경해야하므로 잘하면 그 옵션을 사용할 수 있습니다.

몇 가지 쿼리를 사용하여 연주했는데 더 쉽게이 작업을 수행 할 수 있다고 생각하지 않습니다. 유효하지 않은 멤버가있는 세트를 만들 수 없습니다. 이는 잘못된 튜플을 만들 것이고 아무 것도 제대로 작동하지 않을 것입니다. 나는 또한 "해킹"을 시도하고 예상대로 작동하지 못했습니다.

관련 문제