计算列中的 DAX 分组和排名
DAX Grouping and Ranking in Calculated Columns
我的原始数据停止销售 - 寻找一些 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]))
首先我们得到 custID,根据这个 ID 筛选订单 table,然后将每个客户加在一起。
下一个排名:
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 上的整个 table 并将其加在一起。所以在过滤器中我们实际上只有 3 行!
这对每一行重复,看起来很慢但我只是告诉你这样你就可以理解你得到的结果。实际上,return 数据的快速处理有巧妙的逻辑。
你想做的“Orders[Customer ID]=Orders[Customer ID]”是不可能的,因为你的 Orders[Customer ID] 在过滤器中并且将 运行 与行..
var custid = VALUES(Orders[Customer ID]) Values 是 returning 单个列 table,您不能在过滤器中使用它,因为您随后将单元格值与table.
我的原始数据停止销售 - 寻找一些 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]))
首先我们得到 custID,根据这个 ID 筛选订单 table,然后将每个客户加在一起。
下一个排名:
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 上的整个 table 并将其加在一起。所以在过滤器中我们实际上只有 3 行! 这对每一行重复,看起来很慢但我只是告诉你这样你就可以理解你得到的结果。实际上,return 数据的快速处理有巧妙的逻辑。 你想做的“Orders[Customer ID]=Orders[Customer ID]”是不可能的,因为你的 Orders[Customer ID] 在过滤器中并且将 运行 与行..
var custid = VALUES(Orders[Customer ID]) Values 是 returning 单个列 table,您不能在过滤器中使用它,因为您随后将单元格值与table.