2010-04-16 3 views
5

차원 특성을 기반으로 한 팩트 테이블의 특정 레코드 하위 집합 만 요약 한 계산 된 계수를 만들고 싶습니다.차원 특성을 기반으로 MDX에서 계산 된 계수를 정의하는 방법은 무엇입니까?

을 감안할 때 :

차원

  • 날짜
  • LedgerLineItem {요금, 지불, 쓰기 끄기, 고용인, 신용}

조치

  • LedgerAmount

관계
* LedgerLineItem는

내가 LedgerLineItem.Type에 의해 LedgerAmount을 무너 뜨리는 경우에 나는 쉽게, 등, 충전 지불 얼마나 볼 신용 할 수 FactLedger

의 퇴화 치수하지만 내가하지 않을 때 LedgerLineItem.Type으로 분석 해보면 피벗 테이블에 쉽게 신용, 유료, 신용 등을 추가 할 수 없습니다. 원장 사실의 특정 유형 (또는 여러 유형) 만 합산하는 별도의 계산 된 측정 값을 만들고 싶습니다.

원하는 출력의 예

는 다음과 같습니다 내가 계산 된 측정에게 몇 가지 방법을 만들려고하고 각자가 어떤 상황에 있지만 다른 작동

| Year | Charged | Total Paid | Amount - Ledger | 
| 2008 | $1000 | $600  | -$400   | 
| 2009 | $2000 | $1500  | -$500   | 
| Total | $3000 | $2100  | -$900   | 

. 이제 누구나 ETL에서이 작업을 수행하기 전에 ETL에서 이미 수행했으며 제대로 작동합니다. MDX를 더 잘 이해하는 법을 배우기 위해 노력하고있는 일은 MDX에서 ETL로 수행 한 작업을 지금까지와 같이 복제하는 방법을 파악하는 것입니다.

여기에는 두 가지 시도와 문제가 있습니다. 원장 유형이 피벗 테이블에있는 경우에만 작동합니다. 이 경우는 동일하지만, 그것은 (원장 항목의 정확한 금액을 반환 [양 - 원장]하지만 난 종류를 제거하고 그냥 알 수없는 반환 모든 원장 항목의 합계를 얻을 때

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment] 
AS CASE WHEN ([Ledger].[Type].currentMember = [Ledger].[Type].&[Credit]) 
OR ([Ledger].[Type].currentMember = [Ledger].[Type].&[Paid]) 
OR ([Ledger].[Type].currentMember = [Ledger].[Type].&[Held Money: Copay]) 
THEN [Measures].[Amount - ledger] 
ELSE 0 
END 
, FORMAT_STRING = "Currency" 
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger' ; 

. 원장 유형이 피봇 테이블에없는 경우에만 작동합니다. 항상 총 지불 금액을 반환합니다. 이는 유형별로 슬라이스 할 때 부정확합니다. 이는 신용 한도, 유료 부분, $ 0 충전 중입니다.

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment] 
AS sum({([Ledger].[Type].&[Credit]), ([Ledger].[Type].&[Paid]) 
, ([Ledger].[Type].&[Held Money: Copay])} 
, [Measures].[Amount - Ledger]) 
, FORMAT_STRING = "Currency" 
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger' ; 

Ledger.Type이 포함되어 있는지 여부에 관계없이 올바른 숫자를 반환 할 수있는 방법이 있습니까? 내 피벗 테이블 안에 있니?

답변

7

기존하는 시도 :

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment] 
AS sum(Existing({([Ledger].[Type].&[Credit]), ([Ledger].[Type].&[Paid]) 
, ([Ledger].[Type].&[Held Money: Copay])}) 
, [Measures].[Amount - Ledger]) 
, FORMAT_STRING = "Currency" 
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger' ; 

는이 연극에서 회원에주의해야한다.

+0

당신은 락! 그것은 내가 찾고 있던 바로 것입니다. –

0

Ledger 차원에 FactLedger 내에서 키가 있다고 가정하고 있지만 계산 된 첫 번째 MDX 멤버와 함께 롤업되지 않는 문제로 인해이 점에 대해 다시 생각해 볼 필요가 있습니다.

그러면 원장 유형을 기반으로 한 간단한 SUM이 효과가 있습니까?

+0

원장 유형에 따라 간단한 SUM이하는 일을, 내 피벗 테이블에 장부 유형을 포함하는 것은 꽤 자주 일어납니다. 내가 성취하고자하는 것은 피벗 테이블에 유형을 별도의 엔티티로 포함하지 않고도 합계 유형을 표시하는 것입니다. 예를 들어 총 청구액, 지불액 및 근무 시간과 같은 내 비즈니스를보다 광범위하게 보려면 . 근무 시간은 원장 유형별로 구분되지 않으므로 원장 유형별로 분할하여 전체 청구액과 수익금을 지불해야하는 것은 모든 경우에 대해 유일한 해결책으로 만 사용할 수 있습니다. –

1

Meff의 답변에 댓글을 달 수 없으므로 직접 게시 할 것입니다.

결과는 항상 합계 사용하여 기대하는 것과하지 않을 수 있습니다대로, 대신 합계의 집계를 사용하는 것이 좋습니다 : 내가 원하지 않는 경우를 제외하고

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment] 
AS Aggregate(Existing({([Ledger].[Type].&[Credit]), ([Ledger].[Type].&[Paid]) 
, ([Ledger].[Type].&[Held Money: Copay])}) 
, [Measures].[Amount - Ledger]) 
, FORMAT_STRING = "Currency" 
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger' ; 
+1

AGGREGATE는 기본적으로 SUM과 동일한 결과를 반환합니다. 전체 집계 함수는 SUM과 함께 사용할 수 있기 때문에 실제로 집계가 SUM보다 월등합니다. – SouravA

관련 문제