1

使用 iccube,我想计算日期和年初之间的月数。

我的日期维度中有 2 个层次结构: [Date de sortie].[Année, semestre, trimestre, mois, jour]: 包含年、半年、季度、月和日 [Date de sortie].[Année et Mois]包含年和月

执行以下 mdx 会给我带来好结果(5 个月)

with 
set myData as {[Date de sortie].[Année et Mois].[Mois].&[2017-01-01]:[Date de sortie].[Année et Mois].[Mois].&[2017-05-01]} 
member nbMonths as  myData.count
select
{
    nbMonths
} on 0,
myData on 1
from [Cube]

但是,当尝试对此进行参数化时,它使用从第一个日期开始的时间段,而不是从计算日期(一年中的第一天)开始的时间段。

with 
calculated member beginOfYear as dtWithDayOfYear(lookupByKey([Date de sortie].[Année, semestre, trimestre, mois, jour].[Jour], [Date de sortie].[Année et Mois].[Mois].&[2017-05-01].key),1).key
set myData as {lookupbykey([Date de sortie].[Année et Mois].[Mois], beginOfYear):[Date de sortie].[Année et Mois].[Mois].&[2017-05-01]} 
calculated member nbMonths as  myData.count
select
{
    nbMonths, beginOfYear
} on 0,
myData on 1
from [Cube]

在此处输入图像描述

...

在此处输入图像描述

正如您在上面看到的结果,beginOfYear 似乎计算正确,但未在集合 myData 中使用。因此,它返回 113 而不是 5。

4

1 回答 1

0

仅使用 MDX 可能会很复杂,一种选择是使用 icCube 中的 Java 接口

通过声明一个需要两个日期并使用 Joda 库的函数,这将是直截了当的:

Function NumberOfMonth( Value date1 ,Value date2 ) as
            abs(J!org.joda.time.Months.monthsBetween(date2, date1)->getMonths() )

代码如下所示:

WITH 
  FUNCTION NumberOfMonth( Value date1 ,Value date2 ) as abs( J!org.joda.time.Months.monthsBetween(date2, date1)->getMonths() )
  MEMBER Diff as NumberOfMonth( [D. Time].[H. Time].[Day].&[2015-03-02].key, [D. Time].[H. Time].[Day].&[2015-10-02].key )
SELECT
 [Diff] ON 0
FROM [Sales]

------- 2018 年 3 月 8 日 -------

不要忘记打开 Java 模块并将 classRepositoryActive 设置为 true(如果错误将在下一个版本中修复,则为最新的)

于 2018-03-06T16:13:42.537 回答