DAX 处理不同月份的周期
DAX to handle cycles of different months
我有 2 个 table。
第一个 table:维度 table 显示销售周期开始时可用的汽车数量以及这些数量的可用时间。
第二个 table:显示在 "available cycle".
内给定月份售出的汽车数量
我想比较每个周期内的 "selling behaviour"。因此,我想在周期内每个阶段销售的单位旁边显示可用的初始单位总数。第二维工作正常,但第一维不行。
这是我得到的:
这是所需的输出(注意 available_units 的第 4 行和第 5 行)
我尝试了以下 DAX 代码但没有成功:
SumAvailableUnits:=CALCULATE(SUM([available_units]),FILTER(ALL(Table1[month_within_cycle]),[month_within_cycle]>=MAX([months_available])))
首先,DAX Formatter是你的朋友。您可能喜欢编写难以阅读的单行度量,但没有人喜欢阅读它们。
我还冒昧地清理了您的 table 名称并添加了完全限定的列引用。 (忽略您的维度不是纯维度,因为它包含您在度量中聚合的数值)
SumAvailableUnits :=
CALCULATE (
SUM ( DimCar[available_units] ),
FILTER (
ALL ( FactSale[month_within_cycle] ),
FactSale[month_within_cycle] >= MAX ( DimCar[months_available] )
)
)
我们马上就发现了一个问题。使用完全限定的列引用,很明显您正在尝试通过基础 table(多边)过滤查找 table(单边)。在 Excel 的 Power Pivot 中,我们没有双向关系(尽管它们在 Power BI 中可用并且将于 Excel 2016 年推出)。我们关系的过滤上下文仅从查找 table 流向基础 table,通常从维度流向事实。
此外,你的 DimCar,通过持有 [available_units] 和 [months_available] 编码一个隐含的假设,即特定的 [car_id] 只能引用一个单一的,不变的很多。您将永远不会看到 [car_id] = 1 的另一行。我觉得这不太可能。即使是这种情况,更好的解决方案是更改模型。
一般来说,行或列标签上的任何内容都应来自维度,而不是事实。同样,您在度量中聚合的任何内容都应该存在于事实 table 中。通常的例外是维度计数——要么是裸计数,要么是度量中的分母。遵循这些将帮助您完成维度建模方面的 80%。您可以在下图中看到我最终得到的 tables 和模型图。
这是度量定义
SumAvailableUnits:=SUM( FactAvailability[available_units] )
SumSold:=SUM( FactSale[cars_sold] )
这是我的来源 table,我的关系模型图,以及根据这些部分和上述措施构建的枢轴 table。注意枢轴中 [month_within_cycle] 的来源。
最后,您可能会注意到我的总计的行为方式与您原来的不同。由于这些值每月重复一次,因此我们得到一个更大的总计。如果您需要以最近一个月的总和结束(看起来您的样本中有),您可以使用下面提供的替代度量。我不明白为什么这会是您想要的总计,但您可以很容易地实现它。就个人而言,我可能会在总计级别上取消该措施。
SumAvailableUnits - GrandTotal:=
SUMX(
TOPN(
1
,FactAvailability
,FactAvailability[month_within_cycle]
,0
)
,FactAvailability[available_units]
)
这使用 SUMX() 逐步执行由 TOPN() 定义的 table。 TOPN() returns FactAvailability 中的第一行(在本例中),包括领带,在按 [month_within_cycle] 排序后,在过滤器上下文中可用的所有行中。在特定月份的上下文中,您将获得与该月份关联的所有行 - 与简单求和相同。在总计上下文中,您将获得与上个月关联的行。
SUMX() 遍历 table 并累加 [available_units] 的值。
我有 2 个 table。
第一个 table:维度 table 显示销售周期开始时可用的汽车数量以及这些数量的可用时间。
第二个 table:显示在 "available cycle".
内给定月份售出的汽车数量我想比较每个周期内的 "selling behaviour"。因此,我想在周期内每个阶段销售的单位旁边显示可用的初始单位总数。第二维工作正常,但第一维不行。
这是我得到的:
这是所需的输出(注意 available_units 的第 4 行和第 5 行)
我尝试了以下 DAX 代码但没有成功:
SumAvailableUnits:=CALCULATE(SUM([available_units]),FILTER(ALL(Table1[month_within_cycle]),[month_within_cycle]>=MAX([months_available])))
首先,DAX Formatter是你的朋友。您可能喜欢编写难以阅读的单行度量,但没有人喜欢阅读它们。
我还冒昧地清理了您的 table 名称并添加了完全限定的列引用。 (忽略您的维度不是纯维度,因为它包含您在度量中聚合的数值)
SumAvailableUnits :=
CALCULATE (
SUM ( DimCar[available_units] ),
FILTER (
ALL ( FactSale[month_within_cycle] ),
FactSale[month_within_cycle] >= MAX ( DimCar[months_available] )
)
)
我们马上就发现了一个问题。使用完全限定的列引用,很明显您正在尝试通过基础 table(多边)过滤查找 table(单边)。在 Excel 的 Power Pivot 中,我们没有双向关系(尽管它们在 Power BI 中可用并且将于 Excel 2016 年推出)。我们关系的过滤上下文仅从查找 table 流向基础 table,通常从维度流向事实。
此外,你的 DimCar,通过持有 [available_units] 和 [months_available] 编码一个隐含的假设,即特定的 [car_id] 只能引用一个单一的,不变的很多。您将永远不会看到 [car_id] = 1 的另一行。我觉得这不太可能。即使是这种情况,更好的解决方案是更改模型。
一般来说,行或列标签上的任何内容都应来自维度,而不是事实。同样,您在度量中聚合的任何内容都应该存在于事实 table 中。通常的例外是维度计数——要么是裸计数,要么是度量中的分母。遵循这些将帮助您完成维度建模方面的 80%。您可以在下图中看到我最终得到的 tables 和模型图。
这是度量定义
SumAvailableUnits:=SUM( FactAvailability[available_units] )
SumSold:=SUM( FactSale[cars_sold] )
这是我的来源 table,我的关系模型图,以及根据这些部分和上述措施构建的枢轴 table。注意枢轴中 [month_within_cycle] 的来源。
最后,您可能会注意到我的总计的行为方式与您原来的不同。由于这些值每月重复一次,因此我们得到一个更大的总计。如果您需要以最近一个月的总和结束(看起来您的样本中有),您可以使用下面提供的替代度量。我不明白为什么这会是您想要的总计,但您可以很容易地实现它。就个人而言,我可能会在总计级别上取消该措施。
SumAvailableUnits - GrandTotal:=
SUMX(
TOPN(
1
,FactAvailability
,FactAvailability[month_within_cycle]
,0
)
,FactAvailability[available_units]
)
这使用 SUMX() 逐步执行由 TOPN() 定义的 table。 TOPN() returns FactAvailability 中的第一行(在本例中),包括领带,在按 [month_within_cycle] 排序后,在过滤器上下文中可用的所有行中。在特定月份的上下文中,您将获得与该月份关联的所有行 - 与简单求和相同。在总计上下文中,您将获得与上个月关联的行。
SUMX() 遍历 table 并累加 [available_units] 的值。