DAX Measure 使用其中的参数计算平均值
DAX Measure to calculate average with Parameters inside it
我有这样的数据,
App_Num Days Price
A1 10 100
A1 11 150
A2 11 200
A3 12 250
A3 12 300
A4 20 350
A4 21 400
天数的平均值在卡片视觉对象上显示为 13.857。
现在设置了两个参数供用户调整数值查看。
- 总值(最小和最大范围)
- 天
例如,如果用户选择 0-280-,则应列出 A1(100 + 150 = 250 小于 280)和 A2(200 小于 280)。
我使用了这样的 DAX 并构建了一个像这样的 table,
Apps_in_scope =
Var min_amount = Min('Total Value'[Total Value])
Var max_amount = Max('Total Value'[Total Value])
var required_app_num = SELECTEDVALUE(Table1[App_Num])
Var required_amount = CALCULATE(sum(Table1[Price]),FILTER(Table1,Table1[App_Num] = required_app_num))
var in_scope = if(And(required_amount <= max_amount, required_amount >= min_amount),1,0)
return in_scope
而且我能够制作出这样的视觉效果,
App_Num Apps_in_scope
A1 1
A2 1
A3 0
A4 0
现在选择总价格范围后,如果用户手动选择天数参数为 15,那么我的平均值将按照此逻辑移动。
- A1 有 2 笔交易,在所选价格范围 280 内将变为 (15*2)
- A2 有 1 笔交易,在所选价格范围 280 成为 (15*1)
- A3有2笔交易,将保持不变(12+12)
- A4有2笔交易,将保持不变(20+21)
所以我想放在卡片上的新度量现在预计会显示 (15+15+15+12+12+20+21)/7 = 15.714
这个度量怎么写。请帮我解决这个问题
这是假设您的价格范围和天数选择有单独的表格(如假设参数表)。
My measure =
VAR apps =
SELECTCOLUMNS (
FILTER (
SUMMARIZE ( Table1, Table1[App_Num], "Total Price", SUM ( Table1[Price] ) ),
[Total Price] >= MIN ( 'Total Value'[Total Value] )
&& [Total Price] <= MAX ( 'Total Value'[Total Value] )
),
"App_Num", [App_Num]
)
RETURN
AVERAGEX (
Table1,
IF ( Table1[App_Num] IN apps, SELECTEDVALUE ( Days[Days] ), Table1[Days] )
)
我会稍微调整你的衡量标准,以便它更适合取平均值:
Apps_in_scope_2 =
VAR min_amount = MIN ( 'Total Value'[Total Value] )
VAR max_amount = MAX ( 'Total Value'[Total Value] )
VAR required_amount =
CALCULATE ( SUM ( Table1[Price] ), ALLEXCEPT ( Table1, Table1[App_Num] ) )
VAR in_scope =
IF ( AND ( required_amount <= max_amount, required_amount >= min_amount ), 1, 0 )
RETURN
in_scope
有了这个调整,平均值就相当简单了:
AvgMeasure =
VAR DaysParam = SELECTEDVALUE ( DaysSlicer[Days] )
RETURN
AVERAGEX( Table1, IF( [Apps_in_scope_2] = 1, DaysParam, Table1[Days] ) )
编辑:
这是一个替代版本,它不使用第一个度量,但应该更好地扩展到大型数据表。
AvgAlternate =
VAR min_amount = MIN ( 'Total Value'[Total Value] )
VAR max_amount = MAX ( 'Total Value'[Total Value] )
VAR DaysParam = SELECTEDVALUE ( DaysSlicer[Days] )
VAR apps =
ADDCOLUMNS (
SUMMARIZE (
Table1,
Table1[App_Num],
"@Price", SUM ( Table1[Price] ),
"@Rows", COUNT ( Table1[Price] )
),
"@Days",
IF (
AND ( [@Price] <= max_amount, [@Price] >= min_amount ),
DaysParam * [@Rows],
CALCULATE ( SUM ( Table1[Days] ) )
)
)
RETURN
DIVIDE ( SUMX ( apps, [@Days] ), SUMX ( apps, [@Rows] ) )
我有这样的数据,
App_Num Days Price
A1 10 100
A1 11 150
A2 11 200
A3 12 250
A3 12 300
A4 20 350
A4 21 400
天数的平均值在卡片视觉对象上显示为 13.857。
现在设置了两个参数供用户调整数值查看。
- 总值(最小和最大范围)
- 天
例如,如果用户选择 0-280-,则应列出 A1(100 + 150 = 250 小于 280)和 A2(200 小于 280)。
我使用了这样的 DAX 并构建了一个像这样的 table,
Apps_in_scope =
Var min_amount = Min('Total Value'[Total Value])
Var max_amount = Max('Total Value'[Total Value])
var required_app_num = SELECTEDVALUE(Table1[App_Num])
Var required_amount = CALCULATE(sum(Table1[Price]),FILTER(Table1,Table1[App_Num] = required_app_num))
var in_scope = if(And(required_amount <= max_amount, required_amount >= min_amount),1,0)
return in_scope
而且我能够制作出这样的视觉效果,
App_Num Apps_in_scope
A1 1
A2 1
A3 0
A4 0
现在选择总价格范围后,如果用户手动选择天数参数为 15,那么我的平均值将按照此逻辑移动。
- A1 有 2 笔交易,在所选价格范围 280 内将变为 (15*2)
- A2 有 1 笔交易,在所选价格范围 280 成为 (15*1)
- A3有2笔交易,将保持不变(12+12)
- A4有2笔交易,将保持不变(20+21)
所以我想放在卡片上的新度量现在预计会显示 (15+15+15+12+12+20+21)/7 = 15.714
这个度量怎么写。请帮我解决这个问题
这是假设您的价格范围和天数选择有单独的表格(如假设参数表)。
My measure =
VAR apps =
SELECTCOLUMNS (
FILTER (
SUMMARIZE ( Table1, Table1[App_Num], "Total Price", SUM ( Table1[Price] ) ),
[Total Price] >= MIN ( 'Total Value'[Total Value] )
&& [Total Price] <= MAX ( 'Total Value'[Total Value] )
),
"App_Num", [App_Num]
)
RETURN
AVERAGEX (
Table1,
IF ( Table1[App_Num] IN apps, SELECTEDVALUE ( Days[Days] ), Table1[Days] )
)
我会稍微调整你的衡量标准,以便它更适合取平均值:
Apps_in_scope_2 =
VAR min_amount = MIN ( 'Total Value'[Total Value] )
VAR max_amount = MAX ( 'Total Value'[Total Value] )
VAR required_amount =
CALCULATE ( SUM ( Table1[Price] ), ALLEXCEPT ( Table1, Table1[App_Num] ) )
VAR in_scope =
IF ( AND ( required_amount <= max_amount, required_amount >= min_amount ), 1, 0 )
RETURN
in_scope
有了这个调整,平均值就相当简单了:
AvgMeasure =
VAR DaysParam = SELECTEDVALUE ( DaysSlicer[Days] )
RETURN
AVERAGEX( Table1, IF( [Apps_in_scope_2] = 1, DaysParam, Table1[Days] ) )
编辑:
这是一个替代版本,它不使用第一个度量,但应该更好地扩展到大型数据表。
AvgAlternate =
VAR min_amount = MIN ( 'Total Value'[Total Value] )
VAR max_amount = MAX ( 'Total Value'[Total Value] )
VAR DaysParam = SELECTEDVALUE ( DaysSlicer[Days] )
VAR apps =
ADDCOLUMNS (
SUMMARIZE (
Table1,
Table1[App_Num],
"@Price", SUM ( Table1[Price] ),
"@Rows", COUNT ( Table1[Price] )
),
"@Days",
IF (
AND ( [@Price] <= max_amount, [@Price] >= min_amount ),
DaysParam * [@Rows],
CALCULATE ( SUM ( Table1[Days] ) )
)
)
RETURN
DIVIDE ( SUMX ( apps, [@Days] ), SUMX ( apps, [@Rows] ) )