> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xpertai.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# 多维模型介绍

多维模型是以事实表为基础关联多个维度表的模型, 多维模型将维度数据与事实数据分开管理便于形成更加强大的分析能力.

> 多维模型由多维数据集和维度组成，可对这些多维数据集和维度进行注释和扩展以支持复杂查询构造。 BI 开发人员创建多维数据集以支持快速响应，并提供单个数据源以进行业务报告。 鉴于商业智能在组织的各个层面的重要性不断提高，使用单一的分析数据源可确保将差异减到最小（如果无法完全消除差异）。

名词解释:

* 多维数据集(Cube)
* 维度(Dimension)
* 共享维度(Shared Dimension)
* 层次结构(Hierarchy)
* 层级(Level)
* 度量(Measure)
* 维度成员(Dimension Member)
* 计算成员(Calculated Member)
* 虚拟数据集(Virtual Cube)
* 角色(Role)

## 维度

> 数据库维度是相关对象（称为属性）的集合，用于提供有关一个或多个多维数据集中的事实数据的信息。 例如，产品维度中的典型属性可能是产品名称、产品类别、产品系列、产品规格和产品价格。 这些对象绑定到数据源视图的一个或多个表中的一个或多个列。 默认情况下，这些属性和属性层次结构一样是可见的，可用于了解多维数据集中的事实数据。 可以将属性组织为用户定义层次结构，从而提供导航路径以帮助用户浏览多维数据集中的数据。
>
> 多维数据集包含用户分析事实数据所基于的所有维度。 多维数据集中的数据库维度实例称为多维数据集维度，它与多维数据集中的一个或多个度量值组有关。 数据库维度可以在多维数据集中多次使用。 例如，事实数据表可以具有多个与时间相关的事实数据，并且可以定义单独的多维数据集维度以帮助分析每个与时间相关的事实数据。 但是，只需存在一个与时间相关的数据库维度，这也意味着只需存在一个与时间相关的关系数据库表便可支持多个基于时间的多维数据集维度。
> [https://docs.microsoft.com/zh-cn/analysis-services/multidimensional-models/dimensions-in-multidimensional-models](https://docs.microsoft.com/zh-cn/analysis-services/multidimensional-models/dimensions-in-multidimensional-models)

### 层次结构

层次结构用于将维度的成员组织到分层结构中，并在多维数据集中提供导航路径。 例如，下表定义了时间维度的维度表。 维度表支持三个属性，即年份、季度和月份。

| Year | Quarter | Month |
| ---- | ------- | ----- |
| 1999 | 第 1 季度  | 一月    |
| 1999 | 第 1 季度  | 二月    |
| 1999 | 第 1 季度  | 三月    |
| 1999 | 第 2 季度  | 四月    |
| 1999 | 第 2 季度  | 五月    |
| 1999 | 第 2 季度  | 六月    |
| 1999 | 第 3 季度  | 七月    |
| 1999 | 第 3 季度  | 八月    |
| 1999 | 第 3 季度  | 九月    |
| 1999 | 第 4 季度  | 十月    |
| 1999 | 第 4 季度  | 十一月   |
| 1999 | 第 4 季度  | 十二月   |

用年份、季度和月份属性来构造时间维度中由用户定义的层次结构（即日历）。 “日历”维度（常规维度）的级别和成员之间的关系如下面的关系图所示：

![Middle](https://docs.microsoft.com/zh-cn/analysis-services/multidimensional-models-olap-logical-dimension-objects/media/as-levelconcepts.png?view=sql-analysis-services-2022)

### 父子层次结构

维度的父子层次结构是通过使用特殊属性（称为父属性）来定义的，目的是为了确定成员之间的相互关系。 父属性用于说明维度主表内部的自引用关系或自联接。 父子层次结构是根据单个父属性构造的。 层次结构中出现的级别是通过与父属性关联的成员之间的父子关系形成的，因此只为一个父子层次结构分配一个级别。 父子层次结构的维度架构依赖于维度主表中提供的自引用关系。

![](https://docs.microsoft.com/zh-cn/analysis-services/multidimensional-models/media/dimorganization.png?view=sql-analysis-services-2022)

在该维度表中， ParentOrganizationKey 列与 OrganizationKey 主键列具有外键关系。 换言之，该表中的每个记录都可以通过父子关系与该表中的其他记录相关联。 这种自联接通常用于表示单位的实体数据，例如某个部门内部的雇员管理结构。

创建父子层次结构时，两个属性所表示的列都必须有相同的数据类型。 两个属性还必须在同一个表中。 默认情况下，任何成员的父键只要等于其自身的成员键、空、0（零）或一个未出现在成员键列中的值，则该成员将被认为是顶层中的成员（不包括“（全部）”级别）。

### 维度成员

维度成员是维度内的一个点，由特定的属性值确定。如性别层次结构有两个成员 'M' 和 'F'。“旧金山”、“加利福尼亚州”和“美国”都是门店层次结构的成员。

注意像“旧金山”、“加利福尼亚州”和“美国”这样虽然相互之间存在包含关系, 但他们都是门店层次结构中的成员, 其含义是对门店所属不同层级的统计分析。

## 多维数据集

> 多维数据集是包含用于分析的信息的多维结构；多维数据集主要由维度和度量值构成。 维度定义您用来对其执行切片操作的多维数据集的结构，而度量值提供最终用户感兴趣的聚合数值。 作为逻辑结构，多维数据集允许客户端应用程序检索度量值的值，就像它们包含在多维数据集的单元中一样；将为每个可能的摘要值都定义单元。 多维数据集中的单元通过维度成员的交集定义，并且包含该特定交集处的度量值的聚合值。
>
> 多维数据集提供存储所有相关数据以便进行分析的单一位置。
> [https://docs.microsoft.com/zh-cn/analysis-services/multidimensional-models/cubes-in-multidimensional-models](https://docs.microsoft.com/zh-cn/analysis-services/multidimensional-models/cubes-in-multidimensional-models)

## 度量

> 度量值表示一个列，其中包含可以聚合的可计量数据（通常是数值）。 度量值表示组织活动的一些方面，这些方面以货币术语（如收入、利润或成本）表示，按计数（库存水平、员工数、客户或订单），或者按采用业务逻辑的更复杂的计算表示。

> 每个多维数据集必须至少具有一个度量值，不过大多数都有很多个度量值，有时达到数百个。 从结构上来说，度量值通常映射到事实数据表中的源列，该列提供用于加载度量值的值。 或者，你还可以用 MDX 定义度量值。

> 度量值与上下文相关，在上下文的数值数据上运行，该上下文由碰巧包含在查询中的任何维度成员确定。 例如，计算“分销商销售”的度量值将由 Sum 运算符支持，并且将添加查询中包含的每个维度成员的销售额。 无论查询指定单个产品、 汇总到一个类别，还是按时间或地域进行切分，该度量值都应生成对查询中所含维度有效的操作。

## 计算成员

计算是通过设置计算表达式计算出度量值的度量. 计算为多维模型提供了灵活的计算能力, 实现丰富的功能.

## MDX

### 一、MDX 相对于 SQL 的核心优势

| 维度      | MDX 的优势                                            | 相比 SQL                    |
| ------- | -------------------------------------------------- | ------------------------- |
| 多维建模    | MDX 是专为多维数据（OLAP Cube）设计的查询语言                      | SQL 是关系型二维表的语言，不天然支持多维概念  |
| 时间智能    | MDX 原生支持时间层级（如 YTD、QTD、Moving Avg）                 | SQL 实现相对复杂，需自定义窗口函数或子查询   |
| 维度层级    | 可直接访问层级（如年 → 季度 → 月）                               | SQL 中需手动维护维度层级关系          |
| 聚合表达力   | 支持对维度成员的复杂聚合（如 `Aggregate`, `YTD`, `PeriodToDate`） | SQL 只能基于字段的 `GROUP BY` 聚合 |
| 计算成员    | MDX 支持动态创建计算成员，逻辑灵活                                | SQL 的计算字段受限于表结构和聚合方式      |
| 上下文自动切换 | MDX 依据行/列坐标自动切换上下文（Slicer/Axis）                    | SQL 无上下文概念，需手动管理过滤条件      |

### 二、示例比较

#### 🎯 业务需求：

**统计每年“Mountain Bike”产品类别在“西部地区”的累计销售额（YTD）**

#### 🔸 SQL 实现（简化版）：

```sql theme={null}
SELECT
  YEAR(OrderDate) AS [Year],
  SUM(SalesAmount) OVER (PARTITION BY YEAR(OrderDate) ORDER BY OrderDate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS YTD_Sales
FROM Sales
WHERE Region = 'West' AND ProductCategory = 'Mountain Bike'
```

* SQL 需要显式写出时间窗口、筛选字段、分组逻辑等。
* 不易重用或切换维度。

#### 🔹 MDX 实现：

```mdx theme={null}
WITH 
MEMBER [Measures].[YTD Sales] AS 
    YTD([Order Date].[Calendar].CurrentMember), [Measures].[Sales Amount]

SELECT 
  {[Measures].[YTD Sales]} ON COLUMNS,
  {[Order Date].[Calendar].[Year].Members} ON ROWS
FROM [Sales]
WHERE (
  [Product].[Category].[Mountain Bike],
  [Geography].[Region].[West]
)
```

* 使用 `YTD()` 直接按时间层级累计，无需编写窗口函数。
* `WHERE` 切片器自动调整上下文。
* 易扩展到其他维度或层级（如季度、月）。

### 三、适用场景对比总结：

| 场景                      | 推荐语言 | 理由                |
| ----------------------- | ---- | ----------------- |
| 操作原始交易数据                | SQL  | 高效处理明细数据、事务型查询    |
| 多维分析（如 Cube 报表、OLAP 分析） | MDX  | 维度导航、层级聚合、计算成员等更强 |
| 构建 BI 报表、仪表板指标          | MDX  | 易于表达 KPI、时间智能分析等  |
| 数据仓库 ETL                | SQL  | 结构化数据处理、清洗、合并     |
