2010-04-16 6 views
5

Chciałbym utworzyć obliczoną miarę, która sumuje tylko określony podzbiór rekordów w mojej tabeli faktów na podstawie atrybutu wymiaru.Jak zdefiniować miarę obliczaną w MDX na podstawie atrybutu Dimension?

Dane:

Wymiar

  • Data
  • LedgerLineItem {Charge, płatności, odpis, Copay, Credit}

Środki

  • LedgerAmount

Relacje
* LedgerLineItem jest zdegenerowany wymiar od FactLedger

Gdybym rozbić LedgerAmount przez LedgerLineItem.Type mogę łatwo zobaczyć, ile jest pobierana, zapłacił, kredyt, etc, ale kiedy nie rozbij go przez LedgerLineItem.Type Nie mogę łatwo dodać do tabeli przestawnej kredytu, płatności, kredytu itp. Chciałbym utworzyć oddzielne obliczone miary, które sumują tylko określony typ (lub wiele typów) faktów z ksiąg rachunkowych.

Przykładem pożądanym wyjściem byłoby:

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

Próbowałem stworzyć obliczonej mierzyć kilka sposobów, a każdy z nich działa w pewnych okolicznościach, ale nie w innych. Teraz zanim ktokolwiek mówi, że robię to w ETL, zrobiłem to już w ETL i działa dobrze. Co staram się zrobić, aby nauczyć się lepiej rozumieć MDX, to dowiedzieć się, jak powielić to, co zrobiłem w ETL w MDX, ponieważ do tej pory nie jestem w stanie tego zrobić.

Oto dwie próby, które podjęłam i problemy z nimi. Działa to tylko wtedy, gdy typ księgi znajduje się w tabeli przestawnej. Zwraca odpowiednią ilość zapisów księgi głównej (choć w tym przypadku jest ona identyczna [Kwota - księgi], ale gdy próbuję usunąć typ i po prostu suma wszystkich zapisów księgi głównej zwraca nieznany

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' ; 

. Działa to tylko wtedy, gdy typ księgi nie znajduje się w tabeli przestawnej, zawsze zwraca całkowitą kwotę płatności, która jest niepoprawna, gdy dzielę według typu, ponieważ spodziewałbym się, że część kredytu zostanie uznana za kredytową, część płatna, pod płatną, 0 USD pod obciążeniem, itp.

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' ; 

Czy istnieje sposób na zwrócenie poprawnych liczb niezależnie od tego, czy Ledger.Type zawiera d w moim stole obrotowym czy nie?

Odpowiedz

7

Spróbuj ISTNIEJĄCE:

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' ; 

powinna ona zwrócić uwagę na członków w grze.

+0

Skałasz! To jest dokładnie to, czego szukałem. –

0

Zakładam, że wymiar wymiaru księgi ma klucz w FactLedger, ale kwestia, że ​​nie jest to właściwe w przypadku pierwszego obliczonego elementu MDX, prowadzi mnie do przekonania, że ​​warto przemyśleć te hierachie.

W takim razie proste SUM oparte na typie księgi sprawdziłyby się, czy to ma sens?

+0

prostą sumą w oparciu o typ księgi głównej nie działa, chyba nie chcę aby uwzględnić typ księgi w moim stole przestawnym, co jest dość częste. Próbuję wyświetlić całkowitą liczbę różnych typów bez konieczności uwzględniania typów jako oddzielnych jednostek w tabeli przestawnej, np. Jeśli chcę mieć szerszy obraz mojej firmy, np. Suma naliczonych, opłaconych i przepracowanych godzin . Godziny przepracowane przez personel nie są dzielone według typu księgi głównej, więc konieczność dzielenia według typu księgi, aby uzyskać całkowitą opłatę i płatność, nie jest dla mnie dobrym rozwiązaniem we wszystkich przypadkach, tylko w określonych raportach dotyczących wyłącznie ksiąg rachunkowych. –

1

Nie mogę skomentować odpowiedzi Meffa, więc opublikuję własne.

Należy rozważyć użycie Agregat zamiast Sum, a wyniki nie zawsze mogą być tymi można się spodziewać używając Sum:

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, domyślnie zwróci ten sam wynik co SUMA. AGGREGATE faktycznie jest lepszy od SUM, ponieważ inne funkcje agregacji mogą być używane razem z nim. – SouravA

Powiązane problemy