PowerBI Dax - 计算列,用于根据具有条件的日期带来值

PowerBI Dax - Calculated column to bring value based on date with conditions

提问人:Meettu 提问时间:10/17/2023 更新时间:10/18/2023 访问量:75

问:

我的目标是建立一个有计算的列,指示即将到来的订单将用于填补库存短缺。下图显示了该表目前的情况以及我所取得的成就。我能够根据重新安排的日期带来下一个即将到来的订单,但我无法将订单按正确的顺序进行。我已将视图简化为 Excel,但我在 Powerbi 中使用了数据并使用 Dax。

enter image description here

目前我正在使用以下公式,但我无法编辑它何时更改为下一个订单。公式应意识到重新安排日期低于发生短缺的日期,但不应高于下一个订单的重新安排日期。

Upcoming orders  = 

IF([Indicator] = "Late" && [Change] = "-",

CALCULATE (
MAX ( 'Table1'[ID]),

FILTER ( 'Table1', 'Table1'[Resch date] < [Date] && [Change] = "+" )

),BLANK())

以下是我的目标。

enter image description here

提前感谢您提供任何提示和帮助。

if-statement 条件语句 powerbi DAX 公式

评论


答:

1赞 Alastair 10/17/2023 #1

这个怎么样?

Upcoming orders =
IF(
    [Indicator] = "Late" && [Change] = "-",
    CALCULATE(
        MAX('Table1'[ID]),
        FILTER(
            ALL('Table1'),
            'Table1'[Resch date] < [Date] &&
            'Table1'[Resch date] > EARLIER('Table1'[Resch date]) &&
            'Table1'[Change] = "+"
        )
    ),
    BLANK()
)

Here 返回外部循环中正在计算的当前行的“Resch date”。EARLIER('Table1'[Resch date])

它允许内部 FILTER 函数将每个“Resch 日期”与当前行的“Resch date”进行比较。

有关 EARLIER 功能的更多详细信息

评论

0赞 Meettu 10/17/2023
谢谢你@Alastair的评论和提示。这给了我与我当前公式类似的结果,但如果它可以帮助解决我的问题,我将研究 EARLIER 函数!我认为问题仍然是,当公式意识到与日期列相比,下一个订单的下方或任何时候具有更高或等于 reschdule 日期时,需要一种方法。
0赞 Alastair 10/18/2023
这实际上是相当困难的。在 SQL 中会非常容易:但在 DAX 中要困难得多 您可以在获取 PowerBI 中的数据之前执行操作吗?SQL SELECT table1.*, MAX(table2.ID) FROM material_changes AS table1 LEFT JOIN material_changes AS table2 ON (table2."reschedule_date" <= table1."date" AND table1.indicator = 'shortage') GROUP BY table1.material_number, table1.date, table1.change, table1.id, table1.qty_change, table1.stock, table1.indicator, table1.reschedule_date ORDER BY table1.date;
0赞 Alastair 10/18/2023 #2

是的,我已经为您找到了一个完全可行的解决方案,尽管由于 PowerBI 的限制,它确实需要一些重复。

首先,复制您正在引用的表。它不需要完全重复,但我们需要和IDReschedule Date

Duplicate Table

然后,我们返回到原始表并添加以下新列:

Solution_Column = 
VAR CurrentDate = Table1[date]
VAR CurrentIndicator = Table1[indicator]
RETURN
CALCULATE(
    MAX(Table2[ID]),
    FILTER(
        Table2,
        Table2[reschedule date] <= CurrentDate && CurrentIndicator = "shortage"
    )
)

对于每一行,它都会查找 和 以检查它是否是短缺行。如果是,则它会查找我们创建的新表,并提取早于短缺行日期的最高重新计划日期DateIndicator

Solution

我们开始了!