MDX之百分比
MDX的几种百分比的计算方法
实际应用中,特别是一些分析报表,经常需要计算数据百分比、份额、平均值、累计占比等,在数据仓库飞速发展的今天,我们需要了解一些经常编写的MDX语句的写法,以满足工作中的需要。
由于自己写的带有很大的个性特点,不适合作为标准案例来研究,下面就通过借鉴微软示例库来介绍一下这些常用的MDX写法,以下MDX语句可以在SSAS的示例库:Adventure Works中运行。
例子模型
以下的MDX中用到的Hierarchy如下:

百分比
1)某个子项占总体的百分比。比如:每种Product的销售额占所有Product销售额的百分比。 WITH MEMBER [Measures].[Sale Amount Ratio] AS
'[Measures].[Internet Sales Amount]/([Measures].[Internet Sales Amount], [Product].[Product Categories].[All])' , FORMAT_STRING = '0.00%'
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Sale Amount Ratio]} ON 0,
NON EMPTY [Product].[Product Categories].[Product Name].Members ON 1
FROM [Adventure Works]
2)某个子项占其父项的百分比。比如:每种Product的销售额占其所属的SubCategory销售额的百分比。
WITH MEMBER [Measures].[Sale Amount Ratio] AS
'[Measures].[Internet Sales Amount]/
([Measures].[Internet Sales Amount], [Product].[Product Categories].CurrentMember.Parent)'
, FORMAT_STRING = '0.00%'
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Sale Amount Ratio]} ON 0,
NON EMPTY CROSSJOIN([Product].[Subcategory].[Subcategory].Members,
[Product].[Product Categories].[Product Name].Members) ON 1
FROM [Adventure Works]
3)某个子项占其祖先的百分比。比如:每种Product的销售额占其所属的Category销售额的百分比。
WITH MEMBER [Measures].[Sale Amount Ratio] AS
'[Measures].[Internet Sales Amount]/
([Measures].[Internet Sales Amount],
ANCESTOR([Product].[Product Categories].CurrentMember, [Product].[Product Categories].[Category]))'
, FORMAT_STRING = '0.00%'
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Sale Amount Ratio]} ON 0,
NON EMPTY CROSSJOIN([Product].[Category].[Category].Members, [Product].[Product Categories].[Product Name].Members) ON 1
FROM [Adventure Works]
分配、分摊数量
1)根据一个Measure值来分配数量。比如:按照每种Product占总体的销售额多少来分摊成本。
WITH MEMBER [Measures].[Product Cost] AS
'([Measures].[Internet Total Product Cost], [Product].[Product Categories].[All])*
[Measures].[Internet Sales Amount]/
([Measures].[Internet Sales Amount], [Product].[Product Categories].[All])'
, FORMAT_STRING = '0.00'
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Product Cost]} ON 0,
NON EMPTY [Product].[Product Categories].[Product Name].Members ON 1
FROM [Adventure Works]
2)根据一个Hierarchy来分配数量。比如:在Product Hierarchy中计算每种Category的成本的时候,可以根据每种Category下有多少个产品来进行分配。
WITH MEMBER [Measures].[Product Cost] AS
'([Measures].[Internet Total Product Cost], [Product].[Product Categories].[All])/
Count(
Descendants (
[Product].[Product Categories].CurrentMember,
[Product].[Product Categories].[Product Name],
SELF
),
INCLUDEEMPTY
)'
, FORMAT_STRING = '0.00'
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Product Cost]} ON 0,
NON EMPTY [Product].[Product Categories].[Category].Members ON 1
FROM [Adventure Works]
平均值
1)简单平均值。比如:计算一个月中每天平均的销售额是多少。
WITH MEMBER Measures.[Avg Gross Profit Margin] AS
[Measures].[Internet Sales Amount]/
COUNT(Descendants([Ship Date].[Fiscal].CurrentMember, [Ship Date].[Fiscal].[Date]), INCLUDEEMPTY) 
SELECT
{[Measures].[Internet Sales Amount], Measures.[Avg Gross Profit Margin]} ON COLUMNS,
[Ship Date].[Fiscal].[month].Members ON ROWS
FROM [Adventure Works]
2)加权平均值。没有想到好的例子。
基于时间的计算
1)同比和环比。比如:今年每月的销售额和去年同期相比的变化
这里要补充的是,在同比MDX中,采用COUSIN或ParallelPeriod都可以,但是采用ParallelPeriod更好一些。
2)累计到当前的统计。比如:得到一年中每一个月的累计销售额。
WITH MEMBER Measures.[Additive Internet Sales Amount] AS
SUM(
PeriodsToDate([Ship Date].[Fiscal].[Fiscal Year],[Ship Date].[Fiscal].CurrentMember),
[Measures].[Internet Sales Amount]
)
SELECT
{[Measures].[Internet Sales Amount], Measures.[Additive Internet Sales Amount]} ON COLUMNS,
[Ship Date].[Fiscal].[month].Members ON ROWS
FROM [Adventure Works]
3)移动平均值。比如:计算一种Category过去三个月的平均销售额合计。
WITH MEMBER Measures.[Average Internet Sales Amount] AS
AVG(LastPeriods(3, [Date].[Calendar].CurrentMember),
[Measures].[Internet Sales Amount])
SELECT
{[Measures].[Internet Sales Amount], Measures.[Average Internet Sales Amount]} ON COLUMNS,
NON EMPTY ([Product].[Product Categories].[Category].Members,
DESCENDANTS([Date].[Calendar].[Calendar Year].&[2002], [Date].[Calendar].[Month], SELF)
) ON ROWS
FROM [Adventure Works]
MDX之百分比的更多相关文章
- MDX非常规百分比算法-过滤数据后的百分比
网上有很多关于占比的帖子,基本上都是按照层次结构来做的,比如某个子项占总体的百分比(\all).某个子项占父项的百分比(\parent).某个子项占其祖先的百分比(\ancestor)....等等,如 ...
- MDX函数(官方顺序,带示例)
MDX函数(官方顺序) 1. AddCalculatedMembers (MDX) 返回通过将计算成员添加到指定集而生成的集. 语法: AddCalculatedMembers(Set_Expres ...
- MDX Step by Step 读书笔记(七) - Performing Aggregation 聚合函数之 Max, Min, Count , DistinctCount 以及其它 TopCount, Generate
MDX 中最大值和最小值 MDX 中最大值和最小值函数的语法和之前看到的 Sum 以及 Aggregate 等聚合函数基本上是一样的: Max( {Set} [, Expression]) Min( ...
- MDX Cookbook 03 - MDX 查询中负数,零和空值 NULL 的格式化处理
FORMAT_STRING 属性在处理计算成员(通常是度量值成员)的时候会经常使用到,比如指定标准 Standard, 货币 Currency 或者 Percent 百分比格式.除此之外,还可以自定义 ...
- MDX Step by Step 读书笔记(九) - Working with Time 处理时间
开篇介绍 这一章节主要用到的 MDX 函数: PeriodsToDate( [Level , [Member]] ) - 从指定级别的范围内,返回与指定成员同一级别,从第一个期间开始到指定成员结束的期 ...
- MDX Step by Step 读书笔记(八) - Navigating Hierarchies 层次结构导航
开篇介绍 本章主要内容包括: 解释各种不同的 MDX 导航函数的使用: Parent, Children, FirstChild, LastChild, Siblings, FirstSibling, ...
- MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九
<Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次 SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...
- RS交叉表自动汇总后百分比列显示错误之解决方案
可以说在从事Cognos开发的过程中,仅仅对数据展现而言,大多数用户使用最多的工具便是Report Studio了,此工具可以帮助我们快速的构建一些可供用户自主选择的数据报告.当然我个人认为没有什么开 ...
- css3圆形百分比进度条的实现原理
原文地址:css3圆形百分比进度条的实现原理 今天早上起来在查看jquery插件机制的时候,一不小心点进了css3圆形百分比进度条的相关文章,于是一发不可收拾,开始折腾了... 关于圆形圈的实现,想必 ...
随机推荐
- php-循环普通数组和关联数组
<?php //循环普通数组 $arr=array("杭州","成都","拉萨"); $arrlength=count($arr); ...
- BestCoder10 1001 Revenge of Fibonacci(hdu 5018) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5018 题目意思:给出在 new Fibonacci 中最先的两个数 A 和 B(也就是f[1] = A ...
- codeforces B. Calendar 解题报告
题目链接:http://codeforces.com/problemset/problem/304/B 题目意思:给出两个日期,需要算出这两个日期之间有多少日. 细心模拟就可以了.特别要注意的是,两个 ...
- tomcat启动项目被重新加载,导致资源初始化两遍
之前没有遇到过这个问题,配了三天的项目了,惊人啊!!!各种怪问题全被我赶上了.真有种骂人的冲动. tomcat启动项目时,项目资源被加载两遍. 原因:配置虚拟目录导致,项目被重新加载. <Hos ...
- the art of seo(chapter two)
***Search Engine Basics*** *Understanding How Vertical Results Fit into the SERPs* As a direct conse ...
- POJ 3104 Contestants Division
Contestants Division Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10597 Accepted: ...
- Azure Key Vault (1) 入门
<Windows Azure Platform 系列文章目录> 为什么要使用Azure Key Vault? 我们假设在微软云Azure上有1个场景,在Windows VM里面有1个.NE ...
- URAL 1996 Cipher Message 3
题目 神题. 记得当初DYF和HZA讲过一个FFT+KMP的题目,一直觉得很神,从来没去做. 没有真正理解FFT的卷积. 首先考虑暴力. 只考虑前7位 KMP 找出所有 B 串可以匹配 A 串的位置. ...
- UVaLive 3902 Network (无根树转有根树,贪心)
题意:一个树形网络,叶子是客户端,其他的是服务器.现在只有一台服务器提供服务,使得不超k的客户端流畅,但是其他的就不行了, 现在要在其他结点上安装服务器,使得所有的客户端都能流畅,问最少要几台. 析: ...
- easyui datagrid 列对不齐
function initBIRDataGrid(id,cols){ $('#basicTable').datagrid({ //列表区域 pageList: [5, 10, 15], fit:tru ...