具有不同粒度的相关 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]

查看下面的实际操作:

模型图:

这里有一个简单的度量(除了求和之外没有逻辑)在报告中为您显示正确的聚合: