使用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似乎正确计算,但没有在set myData中使用。因此,它返回113而不是5。
答案 0 :(得分: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(如果将在下一个版本中修复错误,则为最新版本)