2010-04-16 20 views
5

Vorrei creare una misura calcolata che riassuma solo un sottoinsieme specifico di record nella tabella dei fatti basata su un attributo di dimensione.Come si definisce una misura calcolata in MDX in base a un attributo di dimensione?

Attribuite:

Dimension

  • Data
  • LedgerLineItem {carica, pagamento, write-off, Copay, Credit}

Misure

  • LedgerAmount

relazioni
* LedgerLineItem è una dimensione degenerata FactLedger

Se mi abbattere LedgerAmount da LedgerLineItem.Type posso facilmente vedere quanto è caricato, pagato, di credito, ecc, ma quando lo faccio non scomposizione per LedgerLineItem.Type Non riesco ad aggiungere facilmente credito, pagato, credito, ecc. in una tabella pivot. Vorrei creare misure calcolate separate che sommano solo specifici tipi (o più tipi) di fatti contabili.

Un esempio di output desiderato sarebbe:

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

Ho cercato di creare la misura calcolata una coppia di modi e ognuna funziona in alcune circostanze ma non in altre. Ora, prima che qualcuno dica di farlo in ETL, l'ho già fatto in ETL e funziona perfettamente. Quello che sto cercando di fare per imparare a capire meglio MDX è capire come duplicare ciò che ho fatto nell'ETL in MDX, perché finora non sono in grado di farlo.

Qui ci sono due tentativi che ho fatto e i problemi con loro. Funziona solo quando il tipo di ledger si trova nella tabella pivot. Esso restituisce la giusta quantità dei movimenti contabili (anche se in questo caso è identico a [importo - contabilità] ma quando provo per rimuovere il tipo e solo ottenere la somma di tutte le voci contabili che restituisce sconosciuto

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

. Funziona solo quando il tipo di ledger non è nella tabella pivot. Restituisce sempre l'importo totale del pagamento, che non è corretto quando sto tagliando per tipo poiché mi aspetto di vedere solo la parte di credito sotto credito, la parte pagata, sotto pagato, $ 0 in carica, ecc

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

c'è un modo per rendere questo tornare i numeri corretti indipendentemente dal fatto che Ledger.Type è includere d nel mio tavolo pivot o no?

risposta

7

Prova ESISTENTE:

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

dovrebbe rendere prestare attenzione ai membri in gioco.

+0

Sei rock! Questo è ESATTAMENTE quello che stavo cercando. –

0

Suppongo che la dimensione del Ledger abbia una chiave all'interno di FactLedger ma il problema che non si risolve correttamente con il primo membro calcolato MDX mi porta a credere che si possa voler ripensare le gerarchie per questo.

Quindi una semplice SUM basata sul tipo di mastro avrebbe funzionato, non ha senso?

+0

la semplice somma in base al tipo di contabilità funziona, tranne quando io non voglio per includere il tipo di ledger nella mia tabella pivot che è abbastanza frequente. Quello che sto cercando di realizzare è di mostrare il totale di diversi tipi senza dover includere i tipi come entità separate nella tabella pivot, diciamo se voglio una visione più ampia della mia attività, come totale addebitato, pagato e ore di lavoro del personale . Le ore di lavoro del personale non vengono suddivise in base al tipo di contabilità generale, quindi dover suddividere il tipo di contabilità generale per ottenere addebiti totali e retribuzioni non è una soluzione eccellente per me in tutti i casi, ma solo nei rapporti specifici di contabilità generale. –

1

Non posso commentare la risposta di Meff, quindi posterò la mia.

è consigliabile utilizzare Aggregato al posto di Somma, i risultati potrebbero non essere sempre quelli che si aspetterebbe che utilizzano Somma:

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, per impostazione predefinita restituirà lo stesso risultato di SUM. AGGREGATE è in realtà superiore a SUM perché, con esso, è possibile utilizzare altre funzioni di aggregazione. – SouravA

Problemi correlati