当前位置:首页 > 开发 > 开源软件 > 正文

MDX练习(二) ----- 兼顾MSAS与mondrian

发表于: 2009-09-17   作者:dinguangx   来源:转载   浏览次数:
sql
摘要: /* .parent 获取当前成员的父成员 可以结合.currentMember和.parent来获取当前member占父成员的比重 */ with member [percent] as ([Measures].[store sales]) / ([Measures].[store sales],[product].[brand name].parent) ,for
/* .parent 获取当前成员的父成员
   可以结合.currentMember和.parent来获取当前member占父成员的比重
  */
with  member [percent] as
  ([Measures].[store sales]) / ([Measures].[store sales],[product].[brand name].parent)
  ,format_string='0.00%'
select {[Measures].[store sales] ,[Measures].[store cost],[percent]} on columns,
   non empty [product].[brand name].members on rows 
from [sales]

/* ancestor(member,level) 获取当前成员的祖先成员
   可以结合.currentMember和ancestor来获取当前member占祖先成员的比重
  */

with  member [Measures].[percent] as
  ([Measures].[store sales]) / ([Measures].[store sales],ancestor([product].[brand name].currentMember,[product].[product subcategory]))
  ,format_string="0.00%"
select {[Measures].[store sales] ,[Measures].[store cost],[Measures].[percent]} on columns,
   non empty [product].[brand name].members on rows 
from [sales]

/* avg(set[,measure_expr]) 计算集合在某一度量上的平均值
	sum(set[,measure_expr]) 计算集合在某一度量上的总和
	count(set)计算集合中的成员数量
	
  在AS中,不能用Level.members,否则会将all也给统计进来,但在mondrian中却不会这么做
  而且,在AS中,count()运算时,并没有考虑member所在的父级别,而在mondrian中会考虑层次关系:
  亦即,相同名称的member如果处理不同的父层次中,mondrian会将它们作为不同的member,而AS认为它们是
  同一member
*/
with member [avg] as
     avg({[Product].[Brand Name].children},[Measures].[Store Cost])
     member [sum] as
     sum({[Product].[Brand Name].children},[Measures].[Store Cost])
     member [count] as
     count({[Product].[Brand Name].children}) 
select {[avg],[sum],[count]} on columns 
from [sales]

/**
 * 时期相关的一些函数.
 * .prevMember  获得前一个周期成员  可用于进行同期比
 * .nextmember  获得当前成员的后一个成员
 * Parallelperiod(level,num_expr,member)
 */
with member [Measures].[sales increase] as
     [Measures].[Unit Sales] -
        ([Time By Day].[quarter].currentMember.prevMember,[Measures].[Unit Sales])
,format_string="0.00"
select {[Measures].[Unit Sales],[Measures].[sales increase]} on columns,
       {[Time By Day].[quarter].children} on rows 
from [Sales]
//拿当前月与上季度的月分进行比较(即同季度比)
with member [Measures].[sales increase] as
     [Measures].[Unit Sales] - 
          ([Measures].[Unit Sales],ParallelPeriod([Time By Day].[the_month],3,[Time By Day].currentMember))
,format_string="0.00"
select {[Measures].[Unit Sales],[Measures].[sales increase]} on columns,
       {[Time By Day].[the_month].children} on rows 
from [Sales]

/**
 * 下面的例子来说明本年到当前月的总额,如果要统计当前季的总和,就将参数由the_year修改为the_month
 * PeriodsToDate([level[,member]])  
 * 使用这个函数时,level所在的维度应该为时间维度,而且每个level的levelType都应该被正确定义
 * 另外,还可以使用另外一种简洁的表达方式来代替PeriodsToDate()函数.
 *  (1) ytd(member)来代替periodsToDate(<year level>,member)
 *  (2) qtd(member)来代替periodsToDate(<quarter level>,member)
 *  (3) mtd(member)来代替PeriodsToDate(<month level>,member)
 *  (4) wtd(member)来代替PeriodsToDate(<week level>,member)
 */
with member [Measures].[year total sales]
as  'Sum(ytd(),[Measures].[Store Sales])'
select {[Measures].[Store Sales],[Measures].[year total sales]} on columns,
      {[Time By Day].[the_month].members} on rows
from [Sales]

/**
 * <Set> LastPeriods(num_expr,member)选择基于目标成员的时间范围
 *  num_exp:如果为正,向给定的日期之前选择,为负向给定的日期之后选择
 * 示例为:查询April之后的连续5个月的销售量信息
 */
 select {LastPeriods(-5,[Time By Day].[the_month].[April])} on rows,
    [Measures].[Unit Sales] on columns
 from [Sales]
 
 /**
  * 直接获取期初和期末的成员
  * <member> OpeningPeriod([[<level>][,<member>]])
  * <member> ClosingPeriod([[<level>][,<member>]])
  */
//查询1997年的第1个季度和最后一个季度
select {OpeningPeriod([Time By Day].[quarter],[time by day].[the_year].[1997]),ClosingPeriod([Time By Day].[quarter],[time by day].[the_year].[1997])} on 0
from [Sales]
//查询quarter level下的第1个季度和最后一个季度,得到的是[1997].[Q1]和[1998].[Q4]
select {OpeningPeriod([Time By Day].[quarter]),ClosingPeriod([Time By Day].[quarter])} on 0
from [Sales]
//仍然查询quarter level下的第1个和最后一个季度
select {OpeningPeriod([time by day].[1997].[Q1]),ClosingPeriod([time by day].[1997].[Q2])} on 0
from [Sales]
//获取year level下的年份
select {OpeningPeriod(),ClosingPeriod()} on 0
from [Sales]

MDX练习(二) ----- 兼顾MSAS与mondrian

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
一个简单的Mondrian例子(部分参考某个大牛的文档~~)希望大家学到东西~ 可以详细参考豆丁网上的一个
Scala控制结构和函数&练习 1. 一个数字如果为正数,则它的signum为1;如果是负数,则signum为-1;如
软件版本 Mondrian 3.6.1 上一篇文章介绍了如何将Mondrian集成到我的自己的WebApp中并且以XMLA的形
1. 将六个按钮顺序摆放在窗口中,且中央对齐,每个组件之间水平间距10,垂直间距10。 import java.a
1. 输出杨辉三角型的前10行,如下: #include<stdio.h> //JZB写 int main() { int s[10][10];
一、安装 1.先决条件 jdk1.5+ 2.下载 下载地址: http://sourceforge.net/project/showfiles.php?gr
本文摘自:http://www.blogjava.net/pdw2009/archive/2008/04/17/193728.html 一、引言 Mondrian,
软件版本 Mondrian 3.6.1 关于网上的Mondrian的教程有很多,不过好像都是copy的都长的一个样,并且
Mondrian开源war包里的最后一项“XML for Analysis tester ”跑不起来,问题可能出在读request文本
最近在项目中使用了开源OLAP引擎——Mondrian实现一个多维分析系统,在项目后期系统优化阶段使用了M
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号