惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
Hugging Face - Blog
Hugging Face - Blog
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
G
Google Developers Blog
L
LangChain Blog
The GitHub Blog
The GitHub Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
MyScale Blog
MyScale Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
U
Unit 42
Martin Fowler
Martin Fowler
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
博客园 - 聂微东
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
V
V2EX

博客园 - AmyQiu

sql server远程备份和恢复 批编译、重新编译和计划缓存 转:改善SQL Server数据库的内存管理方法 转:SQL Server查询处理器机制与结构 转:影响SQL Server数据库性能设计 转:查询优化 转:SQL 语句优化 转:SQL SERVER什么时候写日志 转:SQL 物理查询原理 MDX实现同比和环比 SSIS2008组件使用测试 MDX查询几个经典示例 Cube的结构 MDX涉及的一些概念 - AmyQiu - 博客园 MDX中函数的应用 MDX优化Set操作 MDX中的Where vs. Subselect/Subcube MDX中一些边界问题的处理 SQL查询SP代码
MDX常见计算方法(百分比/分配/平均值/基于时间的计算)
AmyQiu · 2010-04-07 · via 博客园 - AmyQiu

本文介绍了一些经常编写的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]