在此 SQLBI 视频上,滚动平均值不会对总计行计算任何内容?这是为什么?希望有快照值用于卡上的滚动值等
https://www.youtube.com/watch?v=ACvYaXnpyCM&t=214s
Rolling 6M Sales Amount =
VAR numOfMonths = 6
VAR lastSelectedDate = MAX(Dim_DateTable[dte])
VAR period = DATESINPERIOD(Dim_DateTable[dte], lastSelectedDate,-numOfMonths,MONTH)
VAR result =
CALCULATE(
AVERAGEX(
VALUES(Dim_DateTable[Month Of Year]),
[Sales Amount]
),
period
)
VAR lastSalesDate = MAX(Fact_SalesInvoice[Value Date])
VAR firstVisibleDate = MAX(Dim_DateTable[dte])
RETURN
IF(
firstVisibleDate <= lastSalesDate,
result
)
我也尝试过这个
Rolling 6M Sales Amount B =
VAR numOfMonths = 6
VAR rollingSum =
CALCULATE(
[Sales Amount],
DATESINPERIOD(Dim_DateTable[dte], MAX(Dim_DateTable[dte]), -numOfMonths, MONTH)
)
RETURN
rollingSum/numOfMonths
所以我想了解为什么这些不会为“总计”行提供任何内容,但例如简单的 SUM 函数会为总计行提供值。否则我确实理解这两项措施...
这段代码似乎对我有用,我会尝试解释发生了什么:
首先,可视化中的每个单元格都是行和列过滤器的组合,以便针对特定月份和特定日历年评估表达式。除了总数之外,其中任何一个都没有单一值。
我们需要告诉DAX如何评估总数。通常,您可以使用
HASONEVALUE=FALSE()
来标识 IF 语句中的总计列。在本例中,因为它具有层次结构,所以我使用 ISINSCOPE()
告诉 PowerBI 计算原始问题中的结果,其中月份或日历年在评估范围内。
如果不指定两者,则不会计算中间小计。
接下来,我们需要告诉 PowerBI 在这两个都不在范围内(即不在总计线上)的情况下该怎么做。可能有更优雅的方法来处理此模型,但我根据 Sales 表中的 OrderDate 字段设置了过去 12 个月的并行计算。该字段与日期字段相关。
如果不这样做,结果最终会是空白。我认为这与日期表中的日期多于销售表中匹配的日期记录有关。销售表转到 2009 年 12 月,但日期表扩展到 2011 年。这将导致全局期间 -12 个月内出现一堆空白日期,这些日期在销售表中没有匹配项,并且结果为空。
通常,我通过在 PowerQuery 中将日期表截断为当前日期或前一天来处理此类缺失的关键问题,这样我就不必担心返回的日期超出我的销售表中的日期范围。
在任何情况下,如果我们将总列的期间计算基于销售表中的 OrderDate,似乎都是可行的,这样就不会担心丢失日期。
Sales R12M =
VAR NumOfMonths = 12
VAR LastCurrentDate =
MAX ( 'Date'[Date] )
VAR Period =
DATESINPERIOD ( 'Date'[Date], LastCurrentDate, - NumOfMonths, MONTH )
VAR GlobalMax = CALCULATE(MAX('Sales'[Order Date]), ALL('Date'))
VAR RecentPeriod = DATESINPERIOD ( 'Sales'[Order Date], GlobalMax, - NumOfMonths, MONTH )
VAR Result = IF(OR(ISINSCOPE('Date'[Month]), ISINSCOPE('Date'[Calendar Year])),
CALCULATE (
AVERAGEX (
VALUES ( 'Date'[Calendar Year Month] ),
[Sales Amount]
),
Period
),
CALCULATE(
AVERAGEX (
VALUES ( 'Date'[Calendar Year Month] ),
[Sales Amount]
),
RecentPeriod
))
VAR FirstDateInPeriod = MINX ( Period, 'Date'[Date] )
VAR LastDateWithSales = MAX ( Sales[Order Date] )
RETURN
Result