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]

时间: 2025-01-17 08:49:52

MDX百分比计算方法的相关文章

小数点转百分比

-- ============================================= -- Author: <Author,,CC> -- Create date: <Create Date,, 2014-05-26 10:43:07.080> -- Description: <Description,,小数点转换为百分数,并对第3位进行4舍5入> -- Environment: <Version,, Microsoft SQL Server 2008

距离计算方法总结 转自http://www.cnblogs.com/xbinworld/archive/2012/09/24/2700572.html#2663469

在做分类时常常需要估算不同样本之间的相似性度量(Similarity Measurement),这时通常采用的方法就是计算样本间的“距离”(Distance).采用什么样的方法计算距离是很讲究,甚至关系到分类的正确与否. 本文的目的就是对常用的相似性度量作一个总结. 本文目录: 1. 欧氏距离 2. 曼哈顿距离 3. 切比雪夫距离 4. 闵可夫斯基距离 5. 标准化欧氏距离 6. 马氏距离 7. 夹角余弦 8. 汉明距离 9. 杰卡德距离 & 杰卡德相似系数 10. 相关系数 & 相关距离

SVG path绘制百分比圆弧,给力啊

利用SVG的circle可以绘制百分比圆弧,但总觉得有点不够高端,相比起来,我更喜欢利用SVG的path来绘制百分比圆弧,因为其中会利用到绘制圆弧的基本数学知识(我已经把数学还给了老师,从网络上抓取别人的成果,进行了改造),这样就觉得很有装逼范. 一.效果图 二.实现方法 页面元素构成 <svg height="108" version="1.1" width="108" xmlns="http://www.w3.org/2000

模拟计算超越全国百分比计算方式

最近有个小需求,根据输入的数字,判断超越全国百分多少用户,首先老子肯定是搞不到全国用户的数据的,然后想了半天模拟方式; 百度后各种函数都出来了,作为屌丝的我函数认识我,我不认识他,而且还贼复杂,最后使用了最简单的方式实现了 然后代码如下: /** * 模拟计算超越全国百分之多少的计算方法类 * @param $money * create by lizhanqi(forbidden change code if you need tell to me) * 禁止改动,如需改动联系我 * 百元以内

MySQL计算百分比方法介绍

根据相应条件抽出相应count数(myCount) 抽出总count数(totalCount) 计算百分比:myCount / totalCount * 100 四舍五入:使用ROUND函数ROUND(number,要保留的小数位),ROUND(myCount / totalCount * 100,1) 下面给出示例供参考: SELECT ROUND(T1.co/T2.totalCo*100,1)    FROM      (SELECT COUNT(*) AS co        FROM f

MDX跨cube查询——lookupcube

关于SSAS中从多个cube中查询数据 前提:涉及的cube在同一数据库中,维度共享(最好) SSAS中提供一条mdx语句同时从多个cube中查询数据的功能 实现该功能的就是lookupcube函数,当然前提是这两个cube在同一个数据库中,共享维度(不是共享维度能不能查还没有试验过) lookupcube函数的语法如下: LookupCube(Cube_Name, Numeric_Expression ) LookupCube(Cube_Name, String_Expression ) 其中

background-position百分比原理

今天帮别人调代码时,看到一个样式: background-position: 50% 0;background-size: 100% auto: 对background-size:100% auto,意思是背景图片宽度为元素宽度*100%,高度等比缩放.详情可见css3 background. 对background-position很自然的以为百分比是根据父元素宽度计算的,但background-position真的不是,它有一套自己的原理.下面详细介绍. 一.等价写法 在看各类教程时有以下等

如何为无法获取进度百分比的耗时操作增加“伪进度条”?

在实际开发中,可能会遇到这样的场景:“一个操作非常耗时,但却无法获取其进度百分比”.造成这种情况的原因可能有: 1)该操作属于第三方库(泛指我们使用但无法修改的第三方代码,因此质量有高有底),可能由于第三方库作者没有意识到这个操作在某些情况下会非常耗时,没有提供进度值. 2)某些操作压根就无法计算进度或者计算进度要牺牲极大的效率. 这种场景,执行这样的耗时操作会导致程序UI假死.为了提高用户体验,我们可以为该操作提供一个假的进度条,即保证程序UI不假死.我们将耗时操作放到子线程中去执行,然后在G

poj3819 Coverage (求直线与圆的交占直线的百分比 )

题意:给你一条直线和若干个圆,求圆与直线相交的长度占整条直线的比例 解题思路:通过定比分点的方法求出圆与直线的交占圆的比例. 第一步:(确定投影的方向是x轴还是y轴) (1)当直线的line.s(x, y), line.e(x, y)的line.s.x与line.e.x不同一时候,这条直线能够等同于起点为line.s.x, line.e.x; (2)不满足(1)时(即line.s.x==line.e.x时),当直线的line.s(x, y), line.e(x, y)的line.s.y与line