2009-09-04 3 views
1

판매량 팩트 테이블과 함께 제품 및 시간 차원이있는 상황이 있습니다. 시간이 지남에 따라 제품에 대한 다양한 세부 사항이 제품의 비즈니스 키를 제외하고 변경됩니다. 큐브에서의 제 평면보고에서 제품 차원의 다른 부분이 표시되는지 여부에 관계없이 '비즈니스 키'수준에서 일부 집계를 포함하고자합니다.MDX에서 집계를 수행하는 방법 SQL에서 'sum over partition'문과 비슷합니다.

SQL에서이 같은 사소한 것 :

select sum(volume) over (partition by productKey,year) as Total 

을에 관계없이 내가 선택했던 어떤 다른 사람의 총 열은이 두 분야에 집계 될 것이다.

MDX에서는 동일한 결과를 얻을 수 있었지만 더 간단한 방법이 있어야합니다.

WITH MEMBER Measures.ProductKeyTotal AS 
    'SUM(([Product].[ProductKey],[Time].[Year] 
     ,[Product].[Product Name].[Product Name].ALLMEMBERS 
     ,[Volume Type].[Volume Type Id].[Volume Type Id].ALLMEMBERS) 
     ,[Measures].[Volume])' 
SELECT {[Measures].[Volume],[Measures].[ProductKeyTotal]} ON COLUMNS, 
    NONEMPTYCROSSJOIN ([Product].[ProductKey].[ProductKey].ALLMEMBERS 
     ,[Time].[Time].[Year].ALLMEMBERS 
     ,[Product].[Product Name].[Product Name].ALLMEMBERS 
     ,[Volume Type].[Volume Type Id].[Volume Type Id].ALLMEMBERS) ON ROWS 
FROM [My Cube] 
WHERE ([Product].[Include In Report].&[True]) 

1) 나는 총이 정확하지 않은 계산 된 구성원에 원하지 않는 행에 대한 allmembers을 포함하지 않는 경우, 다른 모든 차원을 무시하도록 강제 할 수있는 바로 가기가 무엇인지 당신이 지정?

내가 묻는 이유 중 하나는 다른 계산 된 멤버를 추가해야한다는 것입니다. 일부는 매개 변수를 사용하고 위 예제의 메서드를 사용하면 동일한 항목을 복제해야 할 것입니다 여러 곳에서 코드가 중요해질 것입니다.

+0

SQL에서는 "partition by"이 필요하지 않습니까? 간단한 "그룹화"가 효과적입니다. –

+0

혼합 입도의 여러 집계가있는 경우에 파티션을 사용합니다. 그렇지 않으면 그룹화가 더 간단합니다. – Peter

답변

2

글쎄, 우선 NonEmptyCrossJoin을 사용하지 마십시오. deprecated입니다. non emptycross join 연산자 (*)를 사용하십시오.

튜플 및 튜플 세트가 질문에 대답하는 방법을 이해하는 것이 중요합니다. 본질적으로 명시 적으로 명시되지 않은 모든 치수는 입니다.은 주어진 치수의 CurrentMember입니다. 일반적으로이 값은 DefaultMember이지만 쿼리의 다른 값으로 설정하면이 값이 변경됩니다. 해당 크기로 ALLMEMBERS을 지정해야하는 이유는 CurrentMember을 사용하고, 그렇지 않은 경우입니다. 너 ALLMEMBERS (특히 평평하지 않은 경우)을 합산하려고 시도하는 대신 [All] 회원을 사용하면 조금 더 나은 성능을 얻을 수 있습니다.

이 작업을 수행하는 가장 좋은 방법은 큐브에 다른 측정 값 그룹을 추가 한 다음 해당 측정 값 그룹에서 측정 값에 적용되지 않는 키를 제거하는 것입니다. 이 방법을 사용하면 실행 시간 계산 (특히 큐브의 모든 것을 합산 할 때 느려지는 경향이 있음)보다는 기본 계산을 얻을 수 있습니다. 또한 Measure Group에서 일부 집계 디자인을 설정할 수도 있으며 매우 효과적입니다.

+0

너무 많은 차원을 가져 왔을 때보고 서비스가 너무 많은 튜플 오류로 인해 폭발하기 때문에 NonEmptyCrossJoin을 사용하고있었습니다. 그 문제를 해결하는 것 같았습니다. 다른 측정 값 그룹을 추가 할 때의 문제점은보다 세부적인 집계에 이미 사용하고있는 사실 테이블을 사용할 수 없다는 것입니다. 필자의 사실 테이블에 대한 쿼리를 기반으로 다른 '테이블'을 추가하려고 시도하지만 비즈니스 키와 연도 및 그 밖의 다른 것에 대해 집계해야하기 때문에 까다로울 수 있습니다. – Peter

관련 문제