【问题标题】:SSAS new calculated member to display summary infoSSAS 新计算成员显示摘要信息
【发布时间】:2024-01-17 06:52:01
【问题描述】:

我面临一个对我来说看起来微不足道但现在无法解决的问题... 我的多维数据集主要有一个 DimDate 维度(为了简化我的问题): 在昏暗的日子里,我有两个层次结构: 将日期分解为日期、月份、季度和年份的一种标准(时间) 一个(三个月时间)将日期分解为日期、月份、三个月(一年的三分之一)和年。 在我的事实表上,我每天都有一个采购订单 (PO) 和一个度量整数(0 或 1),表明采购订单处于活动状态。 在每个日期浏览时,我都能看到有多少 PO 处于活动状态(总和)。

正如您所料,当我查看当月的数据时...我有每天的总和...这显然不是我所期望的。我试图找到那个时期的最后一天开放的号码。

然后我为 dimDate 创建了几个属性: 是日历 Qtr 的最后一天 是日历三个月的最后一天 是日历月的最后一天 是日历年的最后一天

然后我创建了一个新的计算成员,就像这样:

    CREATE MEMBER CURRENTCUBE.[Measures].[MyMeasures]
 AS CASE
    WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].[CalendarYear] then
        ([Measures].[Active],[Dim Date].[Is Last Day Of Month].&[Y],[Dim Date].[Month Of Year].&[12])
    WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].[CalendarQtr] then
        ([Measures].[Active],[Dim Date].[Is Last Day Of Calendar Qtr].&[Y])
    WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].[CalendarMonth] then
        ([Measures].[Active],[Dim Date].[Is Last Day Of Month].&[Y])
    WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].[Date] then
        [Measures].[Active]
    ELSE NULL
END, 
VISIBLE = 1 ,  DISPLAY_FOLDER = 'Duration';   

这一直很好,直到我被要求扩展两个层次结构的度量。 然后我确实用以下内容更新了成员:

    CREATE MEMBER CURRENTCUBE.[Measures].[MyMeasures]
 AS CASE
    WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].[CalendarYear] then
        ([Measures].[Active],[Dim Date].[Is Last Day Of Month].&[Y],[Dim Date].[Month Of Year].&[12])
    WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].[CalendarQtr] then
        ([Measures].[Active],[Dim Date].[Is Last Day Of Calendar Qtr].&[Y])
    WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].[CalendarMonth] then
        ([Measures].[Active],[Dim Date].[Is Last Day Of Month].&[Y])
    WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].[Date] then
        [Measures].[Active]

    WHEN [Dim Date].[Time Trimester].currentMember.Level is [Dim Date].[Time Trimester].[CalendarYear] then
        ([Measures].[Active],[Dim Date].[Is Last Day Of Month].&[Y],[Dim Date].[Month Of Year].&[12])
    WHEN [Dim Date].[Time Trimester].currentMember.Level is [Dim Date].[Time Trimester].[Calendar Year Trimester] then
        ([Measures].[Active],[Dim Date].[Is Last Day Of Calendar Trimester].&[Y])
    WHEN [Dim Date].[Time Trimester].currentMember.Level is [Dim Date].[Time Trimester].[CalendarMonth] then
        ([Measures].[Active],[Dim Date].[Is Last Day Of Month].&[Y])
    WHEN [Dim Date].[Time Trimester].currentMember.Level is [Dim Date].[Time Trimester].[Date] then
        [Measures].[Active]

    ELSE NULL
END, 
VISIBLE = 1 ,  DISPLAY_FOLDER = 'Duration';   

它们在我的过程中一定是概念上错误的东西,但我无法理解...... 有人可以帮我吗?

因此,我在 Excel 中得到以下结果:

with the time hierarchy, it works fine

with the trimester hierarchy, it shows only 3rd trimester...

【问题讨论】:

  • 你从这个测量中得到了什么结果?还是你有例外?
  • 嗨Whytheq,我已经修改了我的问题,以便您可以看到结果....我也不例外。当没有选择维度而只选择了事实时,当我排除 NULL 时,我没有结果... 备注:我的三个月层次结构工作正常

标签: date calendar ssas mdx


【解决方案1】:

[Dim Date].[Time] 中只有这些级别吗?

[Dim Date].[Time].[CalendarYear]
[Dim Date].[Time].[CalendarQtr]
[Dim Date].[Time].[CalendarMonth] 
[Dim Date].[Time].[Date]

如果它们是层次结构的所有级别,那么您的 CASE 语句将永远不会到达您添加的新选项,因为上述 4 之一将始终为真。

【讨论】:

  • 嗨whytheq,是的,这些是我维度中唯一的关卡……你能解释一下为什么吗?我想要实现的是,根据所选维度,我会以不同的方式计算成员,到今天为止,我无法弄清楚这是否可能、合理、普遍做法或仅仅是愚蠢...... :)跨度>
  • @Gaugo 事情是,即使在选择中未选择特定级别,例如说您的选择不包含这 4 个中的任何一个,在幕后我认为将使用默认值 - 并且将是当前成员。我将尝试通过 AdvWrks 进行说明
  • 我想我明白你的意思了....我今天的发现是:由于层次结构使用相同的成员(级别“年”将被使用,而不注意使用什么层次结构......)。我不明白为什么,我只看到第三学期 ..... 备注:如果我交换两个案例块(“时间”和“时间三个月”)那么,我看到所有的三个月,但只有最后一个季度...
  • @Gaugo 我相信您的多维数据集中的每个层次结构都会有一个 currentmember,即使您选择的只有 1 个层次结构:这些通常是每个层次结构的 All 成员。
【解决方案2】:

@whytheQ 在最后一条评论中发现了一个问题:因为您试图满足两个层次结构,所以您需要对其中一个(或两个)层次结构“未使用”的情况做出反应。如果 两个 层次结构都“正在使用”,那么所有的赌注都没有了 - 我不确定我是否会尝试满足这种情况;可能我只是“放弃”并回退到 NULL 值。

试试这个怎么样?

CREATE MEMBER CURRENTCUBE.[Measures].[MyMeasures]
 AS

 -- Is Time hierarchy current member "ALL" level?
 CASE WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].Levels(0)
 THEN
    -- Not interested in Time hierarchy - see if we need to do anything interesting on Time Trimester hierarchy
    CASE 
    WHEN [Dim Date].[Time Trimester].currentMember.Level is [Dim Date].[Time Trimester].[CalendarYear] then
        ([Measures].[Active],[Dim Date].[Is Last Day Of Month].&[Y],[Dim Date].[Month Of Year].&[12])
    WHEN [Dim Date].[Time Trimester].currentMember.Level is [Dim Date].[Time Trimester].[Calendar Year Trimester] then
        ([Measures].[Active],[Dim Date].[Is Last Day Of Calendar Trimester].&[Y])
    WHEN [Dim Date].[Time Trimester].currentMember.Level is [Dim Date].[Time Trimester].[CalendarMonth] then
        ([Measures].[Active],[Dim Date].[Is Last Day Of Month].&[Y])
    WHEN [Dim Date].[Time Trimester].currentMember.Level is [Dim Date].[Time Trimester].[Date] then
        [Measures].[Active]
    ELSE
        -- Time Trimester All - neither hierarchy in use: maybe show measure from last date ever here, instead of NULL?
        NULL
    END
ELSE
     CASE
        WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].[CalendarYear] then
            ([Measures].[Active],[Dim Date].[Is Last Day Of Month].&[Y],[Dim Date].[Month Of Year].&[12])
        WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].[CalendarQtr] then
            ([Measures].[Active],[Dim Date].[Is Last Day Of Calendar Qtr].&[Y])
        WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].[CalendarMonth] then
            ([Measures].[Active],[Dim Date].[Is Last Day Of Month].&[Y])
        WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].[Date] then
            [Measures].[Active]
        -- No need for ELSE here if all levels of [Time] are covered
    END
END
, 
VISIBLE = 1 ,  DISPLAY_FOLDER = 'Duration'; 

如果 [Time] 或 [Time Trimester] 层次结构中的 .CurrentMember 不是全部或叶(日期)级别,则使用 SCOPE 仅调用此逻辑可能会获得更好的性能(或更清晰)。

【讨论】:

    【解决方案3】:

    我使用下面的语句解决了我的问题:

    CASE
        WHEN [Dim Date].[Time].currentMember.Level.Ordinal=0 THEN 
            NULL
        WHEN [Dim Date].[Time Trimester].currentMember.Level.Ordinal<>0 THEN 
    
            CASE WHEN [Dim Date].[Time].currentMember.Level is [Dim Date].[Time].[CalendarQtr] then
                    ([Measures].[Active],[Dim Date].[Is Last Day Of Calendar Qtr].&[Y])
                 WHEN [Dim Date].[Time Trimester].currentMember.Level is [Dim Date].[Time Trimester].[Calendar Year Trimester] then
                    ([Measures].[Active],[Dim Date].[Is Last Day Of Calendar Trimester].&[Y])
    
                 WHEN [Dim Date].[Time Trimester].currentMember.Level is [Dim Date].[Time Trimester].[CalendarYear] then
                    iif(isempty(([Measures].[Active],[Dim Date].[Is Last Day Of Month].&[Y],[Dim Date].[Month Of Year].&[12])),1,([Measures].[Active],[Dim Date].[Is Last Day Of Month].&[Y],[Dim Date].[Month Of Year].&[12]))
                 WHEN [Dim Date].[Time Trimester].currentMember.Level is [Dim Date].[Time Trimester].[CalendarMonth] then
                    ([Measures].[Active],[Dim Date].[Is Last Day Of Month].&[Y])
                 WHEN [Dim Date].[Time Trimester].currentMember.Level is [Dim Date].[Time Trimester].[Date] then
                    [Measures].[Active]
             END
    
        ELSE NULL
        END
    

    我必须承认我对最后的陈述还不满意,但至少这个问题已经解决了......

    【讨论】: