使用 DAX 计算涉及事实表上日期的度量

Calculate measure involving dates on a factTable with DAX

我有这个问题: 给定一个包含仓库交易列表的 "Movements" factTable

我想知道有多少物品到达,有多少物品被运送(这很微不足道),还有 在特定时间 "In Order" 有多少物品(并且这是困难的部分)

因此,每一行都可以是收据(它具有正值 "qIn")或装运(正 qOut)

例如,一个非常简单的记录列表可以是:

ID  Item    TransactionDate OrderDate   qIn qOut
1   A       2019-01-30      2019-01-10  5   0
2   A       2019-02-20      2019-01-15  3   0
3   A       2019-03-12      2019-01-20  0   6
4   A       2019-03-30      2019-02-20  20  0

这意味着:
在 TransactionDate 2019-01-30 项目 A 已到达数量 5。 此订单是在 2019-01-10 上创建的:因此在那 20 天内,商品 A 的数量为 5 "ordered"。 但是,当我在 1 月底观看时,我应该在 "ordered" 度量值中看到此交易为 0,因为它是在 1 月 30 日到达的。

相反,对于第二条记录,在 1 月底我应该看到数量 3 是 "in order",因为实际到货时间是 2019-02-20。

因此,在该行的末尾,Excel 主元 table 应该显示类似这样的情况:

    Year    2019
    Month   January         February        March
            IN | Ord        IN | Ord        IN | Ord
Item
A           5      3         3    20        20   0

qIn 的简单度量是:

qIN := SUM(Transactions[qtaIn])

我目前已经阐明的订购数量的度量(没有任何作用!):

orderedQty :=
CALCULATE (
    SUMX ( Transactions; Transactions[qIn] );
    DATESBETWEEN (
        Transactions[TransactionDate];
        MINX ( Transactions; Transactions[OrderDate] );
        MAXX ( Transactions; Transactions[TransactionDate] )
    )
)

编辑

"InOrder" 度量应该是 "additive",因为它不仅应该考虑当月发生的事情,而且 InOrder 的多少尚未收到过去几个月的

有了图片(但那样做...)整个事情会更清楚,至少从逻辑的角度来看是这样。但是,还有一张图片,我看不出如何从该逻辑中提取 "direct measures"。

相反,利用@Olly 已经提供的措施,问题可以重新表述为:

InOrderFromOtherMonths :=  Sum (qIn) where Order Month <> Current Month

(即过去几个月收到的订单在当月到达的数量)

InOrder := Total sum of (ORDER measure)  -  InOrderFromOtherMonths

PS。 我用一个更有趣的例子创建了 an Excel 文件。
在该文件中,使用 "direct measure picture" 一月的 InOrder 将是: ID 2 + ID 5 + ID 6(1 月底尚未 开放 订单)。 在值 = 3+9+17=29

"indirect" 度量为:

Total sum of ORDER = 15+23+12=50
InOrderFromOtherMonths = 6+15=21
InOrder = Total sum of ORDER - InOrderFromOtherMonths = 50 - 21 = **29**

创建一个日历 table,包括一个 YYYY-MM 字段。如果您还没有日历 table,您可以在 PowerPivot 中自动创建一个:Design > Date Table > New

Calendar[Date]Transactions[TransactionDate]

之间建立活跃关系

Calendar[Date]Transactions[OrderDate]

之间创建 INACTIVE 关系

现在创建您的措施:

测量输入:

IN:=SUM ( Transactions[qIn] )

测量订单:

ORDERS:=
CALCULATE ( 
    SUM ( Transactions[qIn] ),
    USERELATIONSHIP ( 'Calendar'[Date], Transactions[OrderDate] )
)

测量顺序:

ORDER:=
IF ( 
    HASONEVALUE ( 'Calendar'[YYYY-MM] ),
    CALCULATE ( 
        [ORDERS], 
        FORMAT ( Transactions[TransactionDate], "YYYY-MM" ) <>  VALUES ( 'Calendar'[YYYY-MM] )
    )
)

并转向适合:

编辑

在你的问题编辑后,我发现你的一些标签令人困惑 - 但尝试创建以下度量:

测量:已订购

Ordered:=
CALCULATE ( 
    SUM ( Movements[qIn] ),
    USERELATIONSHIP ( 'Calendar'[Date], Movements[OrdDate] )
)

测量:收到

Received:= SUM ( Movements[qIn] )

评价:优秀

Outstanding:= 
VAR EOMaxDate = 
    EOMONTH ( LASTDATE ( 'Calendar'[Date] ), 0 )
RETURN
    IF ( 
        ISBLANK ( [Ordered] ) && ISBLANK ( [Received] ),
        BLANK(),
        CALCULATE ( 
            [Ordered] - [Received],
            FILTER ( 
                ALL ( 'Calendar'), 
                'Calendar'[Date] <= EOMaxDate
            )
        )   
    )

现在在你的数据透视表中使用这三个指标:

或者更明确地说:

参见 https://excel.solutions/so_55596609-2/ 例如 XLSX 文件