2

如果不深入研究数据结构,这些真的很难描述,我会尽量保持简短,同时提供尽可能多的信息。

我有一个衡量标准,它是随时间推移的货币价值(现金流),以及日期维度和估值维度。估值有一个日期,该日期对应于第一个现金流量日期。

im after 的要点是第一个值(或者换句话说,与估值日期相对应的现金流值。如果我知道估值日期,很容易将此日期转换为 Date 维度以获取我之后的值:

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

但是,如果我有一组估价日期(例如,我试图在估价日期获得 3 个月的估价时的价值),这种方法就会失效,因为早期的估价将具有与后估价日期相对应的值。

因此,例如,这个计算成员将返回错误的值:

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]}
)

在此示例中,有 3 个估值(7 月底、8 月和 9 月),每个估值都有从相应估值日期起(月底)的每月现金流值。不是为每个估值返回第一个现金流值,而是获得恰好对应于估值日期的所有现金流值的总和。

我希望这足够清楚,可以开始对这个问题进行一些讨论。如果它有用,这是一个 SQL 查询,可以从我的多维数据集暂存数据库中获取正确的数据:

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

谢谢

4

2 回答 2

2

我最终确实找到了答案,以防万一它对这里的其他人有用。

我最终得到了一个看起来很像这样的计算成员:

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

如果您还记得我需要一组给定日期的第一个“值”。

于 2009-12-17T10:54:06.063 回答
1

当您将集合放入计算成员时,您隐含地要求聚合度量。

为了获得与您的 SQL 查询等效的内容,您必须编写一个 MDX 查询,该查询要求在行上提供一组日期。

例如。

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>]

但是,如果您不知道特定的日期范围并且只想获得第一个值,您可以执行以下操作:

NONEMTPY([Value].[Valuation Date].[Valuation Date].Members * measure.Value).Item(0)

这应该比使用 Filter() 函数快得多

于 2009-12-17T02:53:44.797 回答