问题描述
我的原始数据停止销售-寻找一些DAX帮助,将后两个添加为计算列。
customer_id order_id order_date sales total_sales_by_customer total_sales_customer_rank
------------- ---------- ------------ ------- ------------------------- ---------------------------
BM 1 9/2/2014 476 550 1
BM 2 10/27/2016 25 550 1
BM 3 9/30/2014 49 550 1
RA 4 12/18/2017 47 525 3
RA 5 9/7/2017 478 525 3
RS 6 7/5/2015 5 5 other
JH 7 5/12/2017 6 6 other
AG 8 9/7/2015 7 7 other
SP 9 5/19/2017 26 546 2
SP 10 8/16/2015 520 546 2
解决方法
让我们从客户的总销售额入手:
total_sales_by_customer =
var custID = orders[customer_id]
return CALCULATE(SUM(orders[sales],FILTER(orders,custID = orders[customer_id]))
首先,我们获得客户ID,在该ID上过滤订单表,然后根据每个客户对其求和。
接下来的排名:
total_sales_customer_rank =
var rankMe = RANKX(orders,orders[total_sales_by_customer],Dense)
return if (rankMe > 3,"other",CONVERT(rankMe,STRING))
我们获得每笔客户销售的排名(从第一列中获得),如果该排名大于3,则替换为“其他”
关于第一个问题:DAX与编程语言不同。每行都是单独评估的。让我们开始第一行:您的custID为“ BM”。 接下来,我们计算所有销售额的总和。我们根据custID过滤整个表并将其加和。因此,在筛选器中,实际上只有3行! 对于每一行都重复此过程,似乎很慢,但我只是告诉了这一点,以便您可以了解返回的结果。实际上,有聪明的逻辑可以快速返回数据。 您想做什么“订单[客户ID] =订单[客户ID]”是不可能的,因为您的订单[客户ID]位于过滤器中,并且将与行一起运行。.
var custid = VALUES(Orders [客户ID])值返回一个单列表,您不能在过滤器中使用它,因为您随后将一个单元格值与一个表进行比较。