2009-12-10 3 views
2

Il est vraiment difficile de décrire ce problème sans approfondir la structure des données. Je vais essayer de le garder le plus court possible en donnant autant d'informations que possible.Obtention d'une mesure basée sur la date dans MDX

J'ai une mesure qui est une valeur monétaire au fil du temps (flux de trésorerie), avec les dimensions pour la date, et un pour la valorisation. Une évaluation a une date et cette date correspondrait à la première date de trésorerie. L'essentiel de ce qui suit est la première valeur (ou, en d'autres termes, la valeur du cash flow correspondant à la date d'évaluation.) Si je connais la date d'évaluation, il est assez facile de transformer cette date en dimension Date. la valeur im après:

WITH MEMBER [Measures].[Value at Valuation Date] 
AS 
(
    [Measures].[Value], 
    [Date].[Date].&[2009-09-30T00:00:00] 
) 

Cependant, si j'ai une série de dates d'évaluation (par exemple, im essayant d'obtenir la valeur à la date d'évaluation pour le moût de trois mois d'évaluations), cette méthode se décompose, comme évaluation antérieure serait avoir une valeur correspondant à la date d'une évaluation ultérieure

Par exemple, ce membre calculé retournera le valeurs ong:

WITH MEMBER [Measures].[Value at Valuation Date] 
AS 
(
    [Measures].[Value], 
    {[Valuation.[Valuation Date].&[2009-07-31T00:00:00]:[Valuation].[Valuation Date].&[2009-09-30T00:00:00]} 
) 

Dans cet exemple, il y a 3 évaluations (fin juillet, août &), chacun septembre avec des valeurs de mouvements de trésorerie mensuels à l'avenir (le mois se termine) à partir de la date d'évaluation correspondante. Plutôt que de me renvoyer la première valeur de flux de trésorerie pour chaque évaluation, vous obtenez une somme de toutes les valeurs de flux de trésorerie qui correspondent à une date d'évaluation. J'espère que c'est assez clair pour commencer à discuter de ce problème. Dans le cas où son utilité, il est une requête SQL qui obtiendrait les bonnes données de ma base de données de mise en scène du cube:

SELECT 
    v.valuationDate, 
    SUM(cf.value) as [value at valuation date] 
FROM dbo.Valuation v 
INNER JOIN dbo.Cashflow cf 
ON v.id = cf.valuationId 
and v.valuationDate = cf.cashflowDate 
GROUP BY v.valuationDate 

Merci

Répondre

2

Je l'ai fait travailler la réponse à cette question à la fin, et au cas où sa usefuil à quelqu'un d'autre ici c'est.

J'ai fini avec un membre calculé qui loks beaucoup comme ceci:

([Measures].[Value], 
HEAD(
     FILTER([Date].[Date].Members, Not IsEmpty([Measures].[Value])), 
     2).Item(1)) 

Si vous vous souvenez que je avais besoin la première « valeur » pour un ensemble donné de dates.

+0

J'ai mis à jour ma réponse pour inclure une amélioration à votre solution. –

1

Lorsque vous pust un ensemble dans un membre calculé que vous demandez implicitement la mesure être agrégé. Pour obtenir l'équivalent de votre requête SQL, vous devez écrire une requête MDX qui demande un ensemble de dates sur les lignes.

par ex.

SELECT 
    Measures.[Value] on columns, 
    {[Valuation.[Valuation Date].&[2009-07-31T00:00:00] 
    :[Valuation].[Valuation Date].&[2009-09-30T00:00:00]} on rows 
FROM [<Cube Name here>] 

Mais si vous ne connaissez pas la plage de dates particulière et que vous voulez juste pour obtenir la première valeur que vous pouvez faire ce qui suit:..

NONEMTPY ([valeur] [Date d'évaluation] [date d'évaluation ] * .Members Measures.Value) .Item (0)

ce qui devrait être beaucoup plus rapide que d'utiliser la fonction Filter()

+0

Merci pour la réponse, pas tout à fait ce que je cherche mais comme ces dates je ne peux pas savoir à l'avance. – Jamiec

Questions connexes