【问题标题】:How can I refer to column created in var dynamically?如何动态引用在 var 中创建的列?
【发布时间】:2020-03-13 22:31:36
【问题描述】:

我创建了一个帕累托分析,但问题是它不是动态的,因为它是在客户表的计算列中按照另一个表中的销售额总和的顺序完成的。

现在我的#runningtotal 是

CALCULATE([M-CY_Sales];FILTER(ALLSELECTED(CUSTOMERS);
    CUSTOMERS[DAX RANK]<=MAX(CUSTOMERS[DAX RANK]));CUSTOMERS[Customer Number] <>BLANK();
    'Detail Sales Report'[Total Actual Revenue - Base]>0)

我将计算列与 rankx CUSTOMERS[DAX RANK] 一起使用。我可以使这个度量动态吗?我想用 var 和 addcoloumn 建立一个表,但我做不到。我的实际问题是我需要这种帕累托动态,因为区域过滤器不适用于静态列。

我想写点东西,但我不知道如何才能创造出我想要的东西

#RUNNINGTOTAL2 =
var customerranked=ADDCOLUMNS(ALLSELECTED(CUSTOMERS);"ranking";[M-DAX RANK])
return
CALCULATE([M-CY_Sales];FILTER(ALLSELECTED(CUSTOMERS);
    customerranked<=MAX(customerranked));CUSTOMERS[Customer Number]<>BLANK();
    'Detail Sales Report'[Total Actual Revenue - Base]>0)

显然这是不正确的。我希望你能理解我的问题。我需要在我的度量运行总计中引用一个使用 rankx 完成的虚拟列

使用度量编辑的示例数据:[此处]:https://mega.nz/#!4t1y0AJI!XF2Vcejm6C50nnssQCS1bJEhnqIGiH1d-mIltVskRgE

【问题讨论】:

  • 你能提供 5 行的样本数据,只有两个变量。不要向我们展示您的模型,因为它太复杂而无法快速进入。您可以通过使用输入数据选项创建新表来轻松生成它。即使有人花时间分析它,它也不会被其他人使用。 stackoverflow.com/help/minimal-reproducible-example你说你“做不到”。但为什么?当你尝试某事时会发生什么。你得到什么错误?你到底尝试了什么?
  • 我添加了一个示例数据。我需要一个度量运行总计而不用 rankx 创建一个列。我该怎么办?
  • 请解释你为什么不想要RANKX?动态测量是什么意思?您能否在示例 PBIX 文件中创建预期结果度量(使用可怕的 RANKX)?开始会更容易。
  • 我发布了一个包含所有度量、计算列和视觉的新样本。我需要一种方法来过滤地区并改变我的排名

标签: powerbi dax


【解决方案1】:

确实有可能,并鼓励定义动态计算排名和累积总数的度量。

但是,存在一些可视化问题。看起来不可能将 x 轴的度量与“折线图和聚集柱形图”一起使用。所以不可能对 x 轴使用 Rank 度量。您可以改为将客户编号放在 x 轴上,但是使用分类 x 轴的图表看起来很糟糕。它不适合屏幕,需要长时间滚动才能到达右端。实际上,这几乎不能用作帕累托图。

基于此观察,我建议尽可能使用 R / Python 视觉。这是 R 视觉的示例。

library(dplyr)
library(ggplot2)

totalSales <- sum(dataset$SalesAmount)

dataset <- dataset %>%
    arrange(desc(SalesAmount)) %>%
    mutate(
        CumulativeSales = cumsum(SalesAmount),
        Rank = order(SalesAmount, decreasing = TRUE)
    )

p <- ggplot(dataset, aes(x = Rank, y = SalesAmount)) +
    geom_bar(stat = "identity", width = 1, fill = "#01b8aa")

ymax <- layer_scales(p)$y$range$range[2]

p <- p + geom_line(aes(y = CumulativeSales / totalSales * ymax),
                   size = 1, color = "#fd625e") +
    scale_y_continuous(sec.axis = sec_axis(~ . * totalSales / ymax)) +
    theme_bw()

p

【讨论】:

  • 图表应该在原始 pbix 中起作用。你确定有phyton的必要性吗?
  • 您说您的问题是排名不是在当前过滤器上下文中动态计算的。当您使用区域切片器时,图表看起来就像缺牙一样。使用 R 或 Python 是处理该问题的一种,也许不是唯一的解决方案。
  • 由于模型中的问题导致可视化中的牙齿,您已经完成了图表。无论如何,我的问题是要有一个动态模型并在现在使用计算列的其他度量中使用 rankx 作为度量
  • 绝对可以计算排名和累计总数。如果可视化不是问题,您可以关注this
【解决方案2】:

虽然这里是PBIX file,它可能会按您的预期工作,但您应该拿一把扫帚扫一下您的模型。为了让它工作,只需建立从区域到客户然后到销售的关系。或者更好的是,摆脱 Districts 表。您在客户表中有该维度。我只是稍微更改了您的措施以使其正常工作,但我会完全更改它们。可能你不需要使用 FILTER 功能。

#RUNNINGTOTAL = 
CALCULATE (
    SUM ( 'Sales'[Revenue] ),
    FILTER (
        ALLSELECTED ( Customers ),
        Customers[DAX RANK]
            <= MAX ( Customers[DAX RANK] )
    ),
    'Sales'[Revenue] > 0
)

无论如何我都会从头开始。 为什么你有三张桌子?表区的目的是什么。您可以使用区域表单表客户对销售额进行切片。

如果您真的不接受更正的发票和负销售额(问问自己为什么),建立这样的衡量标准:

[Sales] =
CALCULATE (
    SUM ( FactTable[Sales] ),
    FactTable[Sales] > 0
)

然后在其他措施中引用它。检查这些帖子以查看过滤的差异:

DAX Calculate function with and without FILTER

Difference between CALCULATE(m, x=red) vs CALCULATE(m, KEEPFILTERS(x=red))

您可能会考虑在客户和销售之间构建一个桥接表,其中将包含两个表的唯一 CustomerID。字典更新滞后。

bridge =
DISTINCT (
    UNION (
        DISTINCT (     Sales[CustomerID] ),
        DISTINCT ( Customers[CustomerID] )
    )
)

试一试:https://www.daxformatter.com/

【讨论】:

  • 问题出在度量 #runningperc = SUMX ( FILTER ( ALL ( Customers ); Customers[DAX RANK]
  • 你下载我的pbix了吗?我编辑了我的答案,添加了动画 gif。对于 sud 地区,你有你潜伏的东西。确保您选择的地区有一些客户。否则,您对一位客户的累积度量将是 100%。
  • #runningperc 应该是一个度量值,它是 1/客户计数的累积总和。这样它就不起作用了。只有当您拥有所有客户时才可以
  • 反正我已经下载了你的 pbix 做评论。你明白我的问题了吗?如果仅选择某些地区,#runningperc 将不起作用
  • 你能解释一下“它不起作用”是什么意思吗?您能否选择一个特定的地区并上传两张表(1)如果您选择该地区,您会得到什么(2)另一个表,显示您希望获得什么(预期结果)。请更新您的问题。 cmets 中的空间可能对此感到不舒服。
猜你喜欢
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2015-11-08
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
相关资源
最近更新 更多