【问题标题】:FILTER DAX function is missing the rows in cases where sales for previous DAY is not availableFILTER DAX 函数在前一天的销售不可用的情况下缺少行
【发布时间】:2020-08-09 09:15:55
【问题描述】:

我必须显示前一天的销售以及当前的销售。问题是没有前一天销售的那一天,该行被跳过。我正在使用以下 DAX 函数:

SumInRange = 
var sel = selectedvalue('Table'[Date])
return
CALCULATE(SUMX(DISTINCT('Table'[Date]),CALCULATE(MAX('Table'[Sale]))),FILTER(all('Table'),'Table'[Date] = sel -1))

要复制场景,第一步是使用 - >

创建 Dim Date
Dim Date = GENERATESERIES(date(2019,01,01),date(2019,12,31),1)

第二步是创建DataTable ->

Table = DATATABLE("Date",DATETIME,"Flag1",STRING,"Flag2",STRING,"Sale",INTEGER,{
{"8/1/2019","True","True",200},
{"8/2/2019","False","True",80},
{"8/2/2019","False","True",80},
{"8/2/2019","False","True",80},
{"8/2/2019","False","True",80},
{"8/2/2019","False","True",80},
{"9/3/2019","False","True",60},
{"9/4/2019","False","True",10},
{"9/5/2019","False","True",100},
{"9/6/2019","False","True",30},
{"9/7/2019","False","True",60},
{"9/8/2019","False","False",150},
{"9/9/2019","False","False",80},
{"9/10/2019","False","False",90},
{"9/11/2019","False","False",30},
{"9/12/2019","False","False",20},
{"10/13/2019","False","True",50},
{"10/14/2019","False","True",60},
{"10/15/2019",BLANK(),BLANK(),BLANK()},
{"10/16/2019",BLANK(),BLANK(),BLANK()}
})

第三步 - 在日期列上创建这些表之间的关系

第 4 步 - 创建 Measure 使用 -

SumInRange = 
var sel = selectedvalue('Table'[Date])
return
CALCULATE(SUMX(DISTINCT('Table'[Date]),CALCULATE(MAX('Table'[Sale]))),FILTER(all('Table'),'Table'[Date] = sel -1))

此输出作为屏幕截图附加。您会观察到没有前一天销售的日期被省略,例如 - 08/01/2019。此日期的行被跳过,因为它没有前一天的销售?如何让跳过的行再次返回上一个日期的 0 销售?

【问题讨论】:

  • 创建一个合适的日历表并使用它的日期,而不是事务表中的日期
  • @RADO :这是我创建的一个快速示例。我的实际日历是从 2005 年到 2020 年,并且有更多的列。我的目的是了解 Power BI 的行为。为什么它会跳过数据不可用的行以及如何克服这个问题。我尝试使用 IF(contains(Table,Table[sale] ,selectedvalue(table[sale]) = blank(),0,1)。这也不起作用

标签: powerbi dax


【解决方案1】:

您应该为此使用度量,而不是计算列。此外,SUMX 绝对是一种矫枉过正 - 您不必要地遍历 Table 中的每一行

SumInRange = CALCULATE(SUM('Table'[Sale]),DATEADD('Dim Date'[Value],-1,DAY))

【讨论】:

  • 这是您给定措施的输出 - ibb.co/2N2n72Q 请检查您是否遗漏了某些内容,因为您的示例图像显示了预期的所有内容。
  • 您在视觉对象中使用 Table[Date] 而不是 'Dim Date'[Value],这就是导致问题的原因
  • 好的,我也试过了,这是输出 - ibb.co/4d6g9KT
  • 您是否在表之间设置了 1:many 单向关系,如 OP 帖子的第 3 步所述?
  • 忽略。我发现了我的问题。显然,您的解决方案是更好的解决方案。我投了 1 票,我希望 OP 注意到这一点并接受你的回答而不是我的回答。
【解决方案2】:

您可以使用以下代码在表格“表格”中创建一个新的自定义列。这个新列将保存您的预期结果-

prev_day_sale = 

VAR yesterday = DATEADD('Table'[Date],-1,DAY)

VAR prev_day_sale = 
LOOKUPVALUE(
    'Table'[Sale],
    'Table'[Date], yesterday
)

RETURN IF(
    prev_day_sale = BLANK(),
    0,
    prev_day_sale
)

输出如下-

【讨论】:

  • 谢谢..你的方法有效..你知道为什么,我的计算是跳过行..
  • 很高兴看到它有所帮助。对于您的情况,空白值正在跳过,因为没有找到缺失天数的行。如果前一天不存在,则 as 放置 0。如果真的有帮助,请接受答案:) @sam
  • 它给出了预期的结果,但在度量足够的情况下使用计算列是一种不好的做法sqlbi.com/articles/calculated-columns-and-measures-in-dax
  • 很高兴看到您发布了更好的选择(可能是)。但是,对有效的解决方案投反对票是荒谬的……哈哈哈。仅供参考,赢得声誉并非易事。 @斯塔楚
  • 即使它有效,这也是一种不好的做法,如果你愿意的话,这是一种反模式。我对它投了反对票,因为我认为它导致的问题多于解决的问题
【解决方案3】:

在不更改现有公式的情况下实现此目的的另一种方法是为可视化窗格中的日期属性启用选项“显示没有数据的项目”。请参阅屏幕截图以供参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多