我在PowerBI中有一个表,其中保存了不同日期不同类别的库存水平。示例数据:
库存表
类别 | 日期 | 库存 |
---|---|---|
A | 2023年10月31日 | 15 |
E | 2023年10月31日 | 61 |
A | 2023年12月31日 | 1 |
B | 2023年12月31日 | 13 |
A | 2024 年 1 月 31 日 | 39 |
B | 2024 年 1 月 31 日 | 72 |
B | 2024年2月29日 | 38 |
A | 2024 年 3 月 31 日 | 46 |
更具可读性,InventoryTable 看起来像这样
类别 | 2023年10月31日 | 2023年12月31日 | 2024 年 1 月 31 日 | 2024年2月29日 | 2024 年 3 月 31 日 |
---|---|---|---|---|---|
A | 15 | 1 | 39 | 46 | |
B | 13 | 72 | 38 | ||
E | 61 |
DAX 度量“最新库存”现在应该从每个类别的选定时间片(或更早时间段)中获取最新值,并将它们在类别中求和。
预期输出:
最新库存
类别 | 2023 | 2024 | 总计 |
---|---|---|---|
A | 1 | 46 | 46 |
B | 13 | 38 | 38 |
E | 61 | 61 | 61 |
总计 | 75 | 145 | 145 |
深入到月份,这应该看起来像
最新库存
类别 | 十月 | 十一月 | 十二月 | 2023 总计 | 一月 | 二月 | 三月 | 2024 总计 | 总计 |
---|---|---|---|---|---|---|---|---|---|
A | 15 | 15 | 1 | 1 | 39 | 39 | 46 | 46 | 46 |
B | 13 | 13 | 72 | 38 | 38 | 38 | 38 | ||
E | 61 | 61 | 61 | 61 | 61 | 61 | 61 | 61 | 61 |
总计 | 76 | 76 | 75 | 75 | 172 | 138 | 145 | 145 | 145 |
我绝对无法理解这个问题。大多数方法要么失败,要么因为不同类别具有不同的记录日期,或者类别之间的划分未反映在总数中。有那么难吗
编辑1:
更多地考虑一下,我假设我需要将 DateTable 带入模型中,并沿着日期列对齐我的库存记录。类似于随着时间的推移累积值的做法 - 只是在这种情况下,我不需要随着时间的推移进行求和,而只需要最新的值。
我只是不明白该怎么做。
编辑2:
我现在可能更接近解决方案了。这就是我所拥有的:
Latest Inventory = CALCULATE(
LASTNONBLANKVALUE('InventoryTable'[Date], SUM('InventoryTable'[Inventory])),
DateTable[Date] <= MAX(DateTable[Date]),
ALL(DateTable[Date])
)
它确实计算每个类别的正确值。但是,如果我对类别进行总结,则总数仅包含所有类别的最新日期记录的值的总和。如果之前已记录某一类别,则该类别不会包含在总计中。
已经尝试过
SUMX
超过VALUES('InventoryTable'[Category])
,但这搞乱了整个事情。
与数据透视表结合使用,这应该适用于您的每月和每年数据
MostRecentMonthlyInventory =
VAR CurrentCategory = SELECTEDVALUE('Table'[Category])
VAR CurrentYear = YEAR(MAX('Table'[Date]))
VAR CurrentMonth = MONTH(MAX('Table'[Date]))
RETURN
CALCULATE(
MAX('Table'[Inventory]),
FILTER(
ALL('Table'),
'Table'[Category] = CurrentCategory &&
YEAR('Table'[Date]) = CurrentYear &&
MONTH('Table'[Date]) = CurrentMonth &&
'Table'[Date] = CALCULATE(MAX('Table'[Date]),
ALLEXCEPT('Table', 'Table'[Category])
)
)
)
我首先编写了这段代码,然后改变了我对最佳方法的看法。显示 23 的总数和最近的 24 的总数,并将其包括在内,因为
MostRecentInventory2023 =
CALCULATE(
MAX('Table'[Inventory]),
FILTER(
ALL('Table'),
'Table'[Date] = CALCULATE(
MAX('Table'[Date]),
FILTER(
ALL('Table'),
YEAR('Table'[Date]) = 2023 &&
'Table'[Category] = EARLIER('Table'[Category])
)
)
)
)
MostRecentInventory2024 =
CALCULATE(
MAX('Table'[Inventory]),
FILTER(
ALL('Table'),
'Table'[Date] = CALCULATE(
MAX('Table'[Date]),
FILTER(
ALL('Table'),
YEAR('Table'[Date]) = 2024 &&
'Table'[Category] = EARLIER('Table'[Category])
)
)
)
)