【发布时间】:2018-11-14 17:52:12
【问题描述】:
我正在尝试计算通过我的数据集中包含的一系列点的趋势线的梯度。我已经研究过是否有内置函数可以做到这一点,但似乎没有,所以我是手动做的。我不是 DAX 专家(也可能不是数学专家!)。
我在 excel 中创建了一个表格来演示一个简单的示例,这样我就知道我的目标是什么:
在 Power BI 环境中,有两个表连接到“月和年”列。这些表格的简略说明如下:
请注意,插图中的“订单”度量在 Power BI 代码中称为“每天的特殊订单”。
第 1 步
创建平均月数的度量:
Average of months =
- AVERAGEX (
SUMMARIZE (
CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
Query_GSR[Month&Year],
"AvMonths", AVERAGE ( Query_GSR[MonthNumForSlope] )
),
[AvMonths]
)
我在表达式部分使用 AVERAGE,以便 2018 年 9 月的记录在“AvMonths”列中有 21,然后在 2018 年 10 月它显示为 22。我想我可以使用 MIN 或 MAX,因为它们都会根据月份说 21 或 22(只有一个要避免的是 SUM,因为这会将它们全部加起来)。
我还尝试通过汇总然后在 User_Friendly_Months 表中创建一个 NATURALLEFTOUTERJOIN 来获取这些月份的月份编号,并且在将其合并到此过程的其余部分时,该度量需要永远计算(即使它确实有效)最后以某种方式)。
第 2 步
对订单做同样的事情:
Average of special orders =
- AVERAGEX (
SUMMARIZE (
CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
Query_GSR[Month&Year],
"Special OPD", [Special orders per day]
),
[Special OPD]
)
第 3 步
执行我原始图片中步骤“C”的计算:
Column_C_Step =
SUMX (
SUMMARIZE (
CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
Query_GSR[Month&Year],
"Special OPD", [Special orders per day],
"MonthNum", AVERAGE ( Query_GSR[MonthNumForSlope] )
),
( [Special OPD] + [Average special orders] )
* ( [MonthNum] + [Average of MonthNums] )
)
在我的示例中,该度量返回零,而不是返回 -11.95。
当我这样做时:
Check_orders_worked =
SUMX (
SUMMARIZE (
CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
Query_GSR[Month&Year],
"Special OPD", [Special orders per day],
"MonthNum", AVERAGE ( Query_GSR[MonthNumForSlope] )
),
[Special OPD]
)
...我得到 1188.9,这是我的 Excel 表格插图中“订单”的总数(所以必须有效)。
当我这样做时:
Check_months_worked =
SUMX (
SUMMARIZE (
CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
Query_GSR[Month&Year],
"Special OPD", [Special orders per day],
"MonthNum", AVERAGE ( Query_GSR[MonthNumForSlope] )
),
[MonthNum]
)
...我得到了 43,这是我的插图中 Month_Num 的总和(同样,必须工作)。
但是当我尝试对 A 和 B 执行等效的 SUMPRODUCT 以获得 C 时,它返回零。
谁能解释到底发生了什么?
这让我发疯了。
或者如果有更简单的方法来做梯度计算,我会高兴地哭泣。
谢谢
更新
为了完整起见,这里是有效的措施:
Step_C_Measure =
VAR _OrdersAverage = [Average special orders]
VAR _MonthsAverage = [Average of MonthNums]
RETURN
SUMX (
SUMMARIZE (
CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
Query_GSR[Month&Year],
"Special OPD", [Special orders per day],
"MonthNum", AVERAGE ( Query_GSR[MonthNumForSlope] )
),
( [Special OPD] + _OrdersAverage )
* ( [MonthNum] + _MonthsAverage )
)
然后是步骤 D:
Step_D_Measure =
VAR _MonthsAverage = [Average of MonthNums]
RETURN
SUMX (
SUMMARIZE (
CALCULATETABLE ( Query_GSR, ALLSELECTED ( User_Friendly_Months ) ),
Query_GSR[Month&Year],
"Special OPD", [Special orders per day],
"MonthNum", AVERAGE ( Query_GSR[MonthNumForSlope] )
),
( [MonthNum] + _MonthsAverage )
* ( [MonthNum] + _MonthsAverage )
)
最后得到渐变:
Special order gradient =
DIVIDE ( Step_C_Measure, Step_D_Measure, "" )
【问题讨论】:
-
这对我来说似乎工作量太大了。
-23.9简直就是(582.5 - 606.4)/1,一个月的变化。您是只使用两个点,还是尝试创建更一般的线性回归? -
@AlexisOlson 我刚刚包含了两个数据点用于说明,因此我可以轻松地在计算器上重新执行以进行检查。目的是按客户(可能有数百个)将其用于可能 3、6、9 和 12 个月的梯度计算,以便我可以创建一个报告,将所有客户从最小(最大负梯度)到最大,标记在每个时间段内哪些客户下降最快。
-
您能否编辑您的帖子并通过DAX Formatter 运行您的 DAX,使其更具可读性?必须左右滚动真的很痛苦。 (注意:它希望
MeasureName =出现在公式之前。) -
道歉 - 想知道如何做到这一点。请看上面。我的方法也适用于多个月,但链接到控制 User_Friendly_Months 表的切片器。当我展示了所有 12 个月的内容时,将所有内容加起来并检查我所看到的应该是什么是一件很痛苦的事情,所以我把切片机放到了 9 月和 10 月,这样我就可以检查它了。你会看到这是在我说 ALLSELECTED(User_Friendly_Months) 的 CALCULATETABLE 函数中控制的。