具有不同粒度的相关 table 的 DAX 计算列
DAX calculated column for related table with different grain
我想在我的销售额 table 上创建一个 TRUE/FALSE DAX 计算列来过滤 "Sales of Orders Containing Apples"。简化架构:
产品Table:
| ProductKey | Product |
|------------|---------|
| 1 | Apples |
| 2 | Milk |
销售额table:
| SaleID | ProductKey | Sale Amount |
|--------|------------|-------|
| A | 1 | £2 |
| B | 2 | £4 |
| C | 1 | £8 |
| C | 2 | £16 |
然后我在 Power BI/Power Pivot in Excel 中应用 slicer/filter。最终结果应该是:
| SaleID | Sales of Orders Containing Apples |
|--------|------------|
| A | £2 |
| C | £24 |
我不想创建 "Sales of Orders Containing Apples" 度量。我的真实模型有很多测量值,我想 slice/dice 通过这个新属性对它们全部进行测量。
我可以轻松地将其下推到数据仓库层,但这在 DAX 中是如何实现的?
Sales = SUM ( 'Sales'[Sale Amount] )
Sales of orders containing selected product =
VAR OrdersInContext = VALUES ( 'Sales'[SaleID] )
RETURN
CALCULATE (
[Sales],
ALL ( 'Product' ),
OrdersInContext
)
这实际上比您要求的要普遍得多。希望 [销售] 的定义是不言自明的。
[Sales of orders containing selected product] 首先获取当前上下文中所有 'Sales'[SaleID] 值的列表,其中包括来自所有 dims 的上下文,包括 'Product'。在示例案例中(下面的屏幕截图,来自您的问题),上下文是 'Product'[Product]="Apples",因此我们的变量包含 'Sales'[SaleID] IN {"A" , "C"}.
接下来我们使用 CALCULATE
来操纵评估 [Sales] 的上下文。我们清除 'Product' 上的所有上下文,但应用存储在我们的变量 OrdersInContext.
中的 'Sales'[SaleID] 的上下文
了解这一点,并了解 CALCULATE
的参数是独立计算的,然后相交,我们可以将定义缩短为:
Sales of orders containing selected product =
CALCULATE (
[Sales],
ALL ( 'Product' ),
VALUES ( 'Sales'[SaleID] )
)
我展示第二个,只是因为我发现大多数人都觉得带有变量的样式更容易理解。它在语义上等同于第一个版本。
它正在运行:
编辑: 根据评论,我们想让这种切片器影响事实 table 的所有度量。我假设 table 与更多的 dims 交互,而不仅仅是 'Product'。不过,无论哪种方式,以下模型都可以做到:
- 表格
- 'Product':: 共享的产品维度
- 'ProductSales':: 唯一对 (ProductKey, SaleID)
的桥梁 table
- 'SaleIDs':: table 只有唯一的 SaleID
- 'Sales'::原事实table分享
- 关系:
- 'Product'[ProductKey]-1:N->'ProductSales'[ProductKey]
- 'ProductSales'[销售 ID] <-N:1-> 'SaleIDs'[销售 ID]
- 'SaleIDs'[销售 ID]-1:N->'Sales'[销售 ID]
查看下面的实际操作:
模型图:
这里有一个简单的度量(除了求和之外没有逻辑)在报告中为您显示正确的聚合:
我想在我的销售额 table 上创建一个 TRUE/FALSE DAX 计算列来过滤 "Sales of Orders Containing Apples"。简化架构:
产品Table:
| ProductKey | Product |
|------------|---------|
| 1 | Apples |
| 2 | Milk |
销售额table:
| SaleID | ProductKey | Sale Amount |
|--------|------------|-------|
| A | 1 | £2 |
| B | 2 | £4 |
| C | 1 | £8 |
| C | 2 | £16 |
然后我在 Power BI/Power Pivot in Excel 中应用 slicer/filter。最终结果应该是:
| SaleID | Sales of Orders Containing Apples |
|--------|------------|
| A | £2 |
| C | £24 |
我不想创建 "Sales of Orders Containing Apples" 度量。我的真实模型有很多测量值,我想 slice/dice 通过这个新属性对它们全部进行测量。
我可以轻松地将其下推到数据仓库层,但这在 DAX 中是如何实现的?
Sales = SUM ( 'Sales'[Sale Amount] )
Sales of orders containing selected product =
VAR OrdersInContext = VALUES ( 'Sales'[SaleID] )
RETURN
CALCULATE (
[Sales],
ALL ( 'Product' ),
OrdersInContext
)
这实际上比您要求的要普遍得多。希望 [销售] 的定义是不言自明的。
[Sales of orders containing selected product] 首先获取当前上下文中所有 'Sales'[SaleID] 值的列表,其中包括来自所有 dims 的上下文,包括 'Product'。在示例案例中(下面的屏幕截图,来自您的问题),上下文是 'Product'[Product]="Apples",因此我们的变量包含 'Sales'[SaleID] IN {"A" , "C"}.
接下来我们使用 CALCULATE
来操纵评估 [Sales] 的上下文。我们清除 'Product' 上的所有上下文,但应用存储在我们的变量 OrdersInContext.
了解这一点,并了解 CALCULATE
的参数是独立计算的,然后相交,我们可以将定义缩短为:
Sales of orders containing selected product =
CALCULATE (
[Sales],
ALL ( 'Product' ),
VALUES ( 'Sales'[SaleID] )
)
我展示第二个,只是因为我发现大多数人都觉得带有变量的样式更容易理解。它在语义上等同于第一个版本。
它正在运行:
编辑: 根据评论,我们想让这种切片器影响事实 table 的所有度量。我假设 table 与更多的 dims 交互,而不仅仅是 'Product'。不过,无论哪种方式,以下模型都可以做到:
- 表格
- 'Product':: 共享的产品维度
- 'ProductSales':: 唯一对 (ProductKey, SaleID) 的桥梁 table
- 'SaleIDs':: table 只有唯一的 SaleID
- 'Sales'::原事实table分享
- 关系:
- 'Product'[ProductKey]-1:N->'ProductSales'[ProductKey]
- 'ProductSales'[销售 ID] <-N:1-> 'SaleIDs'[销售 ID]
- 'SaleIDs'[销售 ID]-1:N->'Sales'[销售 ID]
查看下面的实际操作:
模型图:
这里有一个简单的度量(除了求和之外没有逻辑)在报告中为您显示正确的聚合: