MDX 用Ancestors得到Hierarchy中指定Level的值(附带SCOPE用法之一)

需求:用户想要用Excel,对比每月预算和整年预算,需要在两个的Hierarchy浏览时显示同一个值。财年季月日(FYQMD)和财年月日(FYMD)。

自定义hierarchy

属性关系(Attribute Relationships)

下面我们用Ancestors来拿到当前member所在Hierarchy对应的Financial Year。

CREATE MEMBER CURRENTCUBE.MEASURES.[Full Year Budget] AS NULL;

SCOPE(MEASURES.[Full Year Budget]);
    THIS = SUM(
                Ancestors([Posting Date].[Date FYMD].CURRENTMEMBER, [Posting Date].[Date FYMD].[Financial Year]),
                [Measures].[Budget]);
END SCOPE;
这里Ancestors的第二个参数指定了要得到当前member所在Hierarchy的[Financial Year] level的值。

得到以下结果:

Budget是用户输入的Amount的SUM。

为了让两个维度显示同一个Measure,这里用到了Scope语句,这个东东,就像DAX里面的CALCULATE一样的牛牪犇!!!

先弄两个隐藏的Measure:

--99 - Full Year Budget FYMD
CREATE MEMBER CURRENTCUBE.MEASURES.[99 - Full Year Budget FYMD] AS NULL, DISPLAY_FOLDER = ‘Budget Full Year‘                                  ,  ASSOCIATED_MEASURE_GROUP = ‘Finance Budget Transactions‘,VISIBLE = 0; 

SCOPE(MEASURES.[99 - Full Year Budget FYMD]);
    THIS = SUM(
                Ancestors([Posting Date].[Date FYMD].CURRENTMEMBER, [Posting Date].[Date FYMD].[Financial Year]),
                [Measures].[Budget]);
         BACK_COLOR(THIS) = RGB(247,252,185); --light yellow
END SCOPE;

--99 - Full Year Budget FYQMD
CREATE MEMBER CURRENTCUBE.MEASURES.[99 - Full Year Budget FYQMD] AS NULL, DISPLAY_FOLDER = ‘Budget Full Year‘                                  ,  ASSOCIATED_MEASURE_GROUP = ‘Finance Budget Transactions‘,VISIBLE = 0; 

SCOPE(MEASURES.[99 - Full Year Budget FYQMD]);
    THIS = SUM(
                Ancestors([Posting Date].[Date FYQMD].CURRENTMEMBER, [Posting Date].[Date FYQMD].[Financial Year]),
                [Measures].[Budget]);
         BACK_COLOR(THIS) = RGB(247,252,79); --79
END SCOPE;

再用Scope把它们包起来,显示为[Full Year Budget]:

--Full Year Budget
CREATE MEMBER CURRENTCUBE.MEASURES.[Full Year Budget] AS NULL, DISPLAY_FOLDER = ‘Budget Full Year‘,                                       ASSOCIATED_MEASURE_GROUP = ‘Finance Budget Transactions‘,VISIBLE = 1; 

SCOPE(MEASURES.[Full Year Budget]);

    --Fiscal YTD FYQMD
    SCOPE([Posting Date].[Date FYQMD].[Financial Year].MEMBERS);
         THIS = Measures.[99 - Full Year Budget FYQMD];
    END SCOPE;

    SCOPE([Posting Date].[Date FYQMD].[Quarter].MEMBERS);
        THIS = Measures.[99 - Full Year Budget FYQMD];
    END SCOPE;

    SCOPE([Posting Date].[Date FYQMD].[Month].MEMBERS);
        THIS = Measures.[99 - Full Year Budget FYQMD];
    END SCOPE;

    SCOPE([Posting Date].[Date FYQMD].[Day].MEMBERS);
        THIS = NULL;
    END SCOPE; 

    --Fiscal YTD FYMD
    SCOPE([Posting Date].[Date FYMD].[Financial Year].MEMBERS);
        THIS = Measures.[99 - Full Year Budget FYMD];
    END SCOPE;

    SCOPE([Posting Date].[Date FYMD].[Month].MEMBERS);
        THIS = Measures.[99 - Full Year Budget FYMD];
    END SCOPE; 

    SCOPE([Posting Date].[Date FYMD].[Day].MEMBERS);
        THIS = NULL;
    END SCOPE;
END SCOPE;

最终得到结果如下:

左边是FYQMD,右边是FYMD。(可以看到右边的Budget YTD没有用Scope这个trick--基于FYQMD建的Measure,没有显示正确,坏了,哈哈。)

基于上面可以定义各种variance,和variance %。

例子:https://www.purplefrogsystems.com/blog/2010/08/calculate-run-rate-full-year-projection-in-mdx/

http://stackoverflow.com/questions/16545745/mdx-calculate-sum-at-a-fixed-level-in-hierarchy

https://bidrone.wordpress.com/2013/04/25/mdx-ancestorsumytd-function-target-calculation-for-different-time-levels/

时间: 2024-09-30 02:00:47

MDX 用Ancestors得到Hierarchy中指定Level的值(附带SCOPE用法之一)的相关文章

在不允许新建对象的条件下,将list中指定条件的值去除

package com.liujianwang.learning; import java.util.LinkedList; import java.util.List; public class ListTest { public static void main(String[] args) { /* * 在不允许新建对象的条件下,将list中指定条件的值去除. * 例如:移除list中值大于6的元素. */ //测试数据 List<Integer> list = new LinkedLi

在浏览器中使用jquery取得iframe中页面中指定元素的值的不同

自己使用aspx页面中嵌套了ascx的页面其中使用了iframe的一些内容,出现了同一个页面的两种取值的方式 1. 在iframe的包含页面,需要使用iframe的页面中的元素,是需要使用$(window.frames["yourframename"].document).find("#yourelementid")的形式,这个是在调试页面的时候在ie和chrome的开发者工具试过的. 2. 在ascx页面写的时候,和ascx的包含页面(iframe包含的是ascx

js获取url中指定参数的值(含带hash)

function getUrlVars() { var vars = {}; var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (m, key, value) { vars[key] = value; } ); return vars; } 使用如: http://localhost?name=xxg getUrlVars()["name"] 返回的值为 xx

获取局域网中指定IP或是主机名称的所有文件夹及其搜索文件

最近做个功能在局域网中所有指定文件,于是花了点精力完成了部分功能,先贴上 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Syst

Kafka深度解析(如何在producer中指定partition)(转)

原文链接:Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐率.即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输 同时支持离线数据处理和实时数据处理 为什么要用消息系统 解耦在项目启动之初来预测将来项目会碰到

做一个手机端页面时,遇到了一个奇怪的问题:字体的显示大小,与在CSS中指定的大小不一致

最近在做一个手机端页面时,遇到了一个奇怪的问题:字体的显示大小,与在CSS中指定的大小不一致.大家可以查看这个Demo(记得打开Chrome DevTools). 就如上图所示,你可以发现,原本指定的字体大小是24px,但是最终计算出来的却是53px,看到这诡异的结果,我心中暗骂一句:这什么鬼! 随后开始对问题各种排查:某个标签引起的?某个CSS引起的?又或者是某句JS代码引起的.通过一坨坨的删代码,发现貌似都不是.我不禁又骂,到底什么鬼!不过中间还是发现了一些端倪:当页面中的标签数量或者文本数

仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表中为标识列指定显式值问题

今天在处理数据库过程中碰到这样的问题在插入一条数据到表中 系统报这样的错误 仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表中为标识列指定显式值问题 表有一列是自增长的标识列 ”字段1“ 如果这样插入 SET IDENTITY_INSERT platform..as_userinfo ON INSERT INTO platform..As_UserInfo values('110','张飞','男',20120401,18,'团员',2008-3-1) SET I

Python 可视化Twitter中指定话题中Tweet的词汇频率

CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-8 @author: guaguastd @name: plot_frequencies_words.py ''' if __name__ == '__main__': #import json # import Counter from collections import Counter # import search from search impor

js获取一个字符串中指定字符串第n次出现的位置

1.JS获取一个字符串中指定字符串第n次出现的位置 了解类似的获取字符位置的方法: 1.1 charAt() 获取字符串指定位置的字符 用法:strObj是字符串对象,index是指定的位置,(位置从0开始数) strObj.charAt(index) 1.2 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置 用法:stringObject是字符串对象,searchvalue是指定的字符串值,fromindex(可有可无)指定开始匹配字符串值的位置,若无,表示从0位置开始