1.values的反作用
CALCULATE (
[Actual],
FILTER (
'D_Product',
D_Product[is_newflag] = "Y"
|| D_Product[is_newflag] = "N"
)
)
CALCULATE (
[Actual],
FILTER (
VALUES('D_Product'[is_newflag]),
D_Product[is_new_initiative_flag] = "Y"
|| D_Product[is_newflag] = "N"
)
)
第一个公式的动作是D_Product表的D_Product[is_newflag]筛选出Y或者N,然后通过product key直接筛选fact表。
第二个公式是D_Product表与fact表left join后,where D_Product[is_newflag] =Y or N
所以第一个公式快
2.switch的写法
永远不要在switch公式前,var前期定义任何大量计算
3.时间区间的写法:KEEPFILTERS+DATESBETWEEN与比较运算符
GIV_Actual_test_keepfilter:=
VAR d =
CALCULATE ( MAX ( D_Date[Date] ), ALL ( T_Slicer ), ALL ( 'D_Date' ) )
var t=CALCULATE ( MIN ( D_Product[new_initiative_sos_date] ) ) //sos的日期
var sosd =DATE(YEAR(t),MONTH(t),1) //从1号开始,因为month的日期为x年x月1号
return CALCULATE (SUM ( F_Monthly[spm_no_transit_gross_invoice_value] ),
ALL('T_Slicer'), KEEPFILTERS( DATESBETWEEN(D_Date[Date],sosd,d)
))
GIV_Actual_test_>sosd:=
VAR d =
CALCULATE ( MAX ( D_Date[Date] ), ALL ( T_Slicer ), ALL ( 'D_Date' ) )
var t=CALCULATE ( MIN ( D_Product[new_initiative_sos_date] ) ) //sos的日期
var sosd =DATE(YEAR(t),MONTH(t),1) //从1号开始,因为month的日期为x年x月1号
return CALCULATE (SUM ( F_Monthly[spm_no_transit_gross_invoice_value] ),
FILTER (
ALL ( 'D_Date'[Date] ),
'D_Date'[Date] >= sosd)
,ALL('T_Slicer')
)
image.png
第一个公式速度较快,(其实加不加keepfilters的速度没影响,但是为了保持上下文的正确还是加了)
ALL('T_Slicer')这一步很重要,公式不受页面时间切片影响,第二个公式的大于号计算需要调用FE公式引擎,并且比第一个公式多一个SE查询
总结:时间区间写法上DATESBETWEEN比 比较运算符快
4.返回上一层级:treatas与filterr+values+in
GIV_NI%_of_brand_filter_in:=
VAR brand =
VALUES ( 'D_Product'[brand_name_en] )
VAR category =
VALUES ( 'D_Product'[category_name_en] )
VAR y =
CALCULATE (
[GIV_Actual_test],
ALL ( D_Product_Type[NI Product hierarchies] ),
ALL ( D_Product_Type[sub_product] ),
ALL ( D_Product[product_name_en] ),
ALL ( D_Product[product_name_cn] ),
ALL ( D_Product[brand_name_en] ),
ALL ( D_Product[brand_name_cn] ),
ALL ( D_Product[category_name_en] ),
ALL ( D_Product[new_initiative_project_name] ),
ALL ( D_Product[is_new_initiative_flag] ),
FILTER(VALUES(D_Product_All[brand_name_en]), D_Product_All[brand_name_en] in brand),
FILTER(VALUES(D_Product_All[category_name_en]), D_Product_All[category_name_en] in category )
)
RETURN
y
GIV_NI%_of_brand_treatas:=
VAR brand =
VALUES ( 'D_Product'[brand_name_en] )
VAR category =
VALUES ( 'D_Product'[category_name_en] )
VAR y =
CALCULATE (
[GIV_Actual_test],
ALL ( D_Product_Type[NI Product hierarchies] ),
ALL ( D_Product_Type[sub_product] ),
ALL ( D_Product[product_name_en] ),
ALL ( D_Product[product_name_cn] ),
ALL ( D_Product[brand_name_en] ),
ALL ( D_Product[brand_name_cn] ),
ALL ( D_Product[category_name_en] ),
ALL ( D_Product[new_initiative_project_name] ),
ALL ( D_Product[is_new_initiative_flag] ),
TREATAS ( brand, D_Product_All[brand_name_en] ),
TREATAS ( category, D_Product_All[category_name_en] )
)
return y
treatas 还是比较快的
5.计算非重复值
Productivity_sku_1:=SUMX(VALUES(F_Sell_In_Out[sfa_code]),1)
Productivity_sku_2:=SUMX(VALUES(D_SaleStore_sfa_code[sfa_code]),1)
Productivity_sku_7:=DISTINCTCOUNT(D_SaleStore_sfa_code[sfa_code])
上面3条公式速度差不多
Productivity_sku_6:=
DISTINCTCOUNT(F_Sell_In_Out[sfa_code])
Productivity_sku_5:=
var t=VALUES(F_Sell_In_Out[sfa_code])
return
COUNTROWS(t)
网友评论