【问题标题】:dax for events in progress at end of period using date table使用日期表在期末进行中的事件的 dax
【发布时间】:2019-06-05 20:59:14
【问题描述】:

我需要按日期汇总所有开放机会的总金额。每条记录都附有一个 [valid from] 和一个 [valid to] 日期。当数据库中的机会得到更新时,会添加一个新行,其中包含 [valid from] date = today 和 [valid to] date = end of time (12/31/2100)。上一行的 [valid to] 日期获取昨天的日期。

推理:因为每天可以多次更改机会,所以我们只关心每天超过 11:59:59 阈值的版本。当机会发生变化时,之前的版本仅在前一天结束之前有效,因此它的 [valid to] 字段获取前一天的日期。

当按大于日期的单位进行细分时,我需要当时机会的最后一个正确版本。例如,1 月份的美元金额是 1 月 31 日 11:59:59 机会的最近美元价值的金额。

这是我的架构的简化版本:

这是一些示例数据:

Opp Number  Dollars Opp Created Date    Header Valid From   Header Valid To
1           100         1/1/2019        1/1/2019            1/3/2019
1           50          1/1/2019        1/4/2019            1/5/2019
1           75          1/1/2019        1/6/2019            12/31/2100
2           200         1/3/2019        1/3/2019            1/4/2019
2           210         1/3/2019        1/5/2019            1/6/2019
2           250         1/3/2019        1/7/2019            12/31/2100

鉴于此示例数据集,数据透视表应如下所示:

Dates   Sum of Dollars
1/1/2019    100
1/2/2019    100
1/3/2019    300
1/4/2019    250
1/5/2019    260
1/6/2019    285
1/7/2019    325
1/8/2019    325
...
1/31/2019   325
January     325

我尝试了几种方法,但无济于事。以下是我尝试过的参考资料:

我能够让它在 dax studio 中按预期工作,但我无法将其转化为度量。

EVALUATE
ADDCOLUMNS (
    VALUES ( 'DIM Date'[Date]),
    "Open Orders",
    SUMX (
        FILTER (
            GENERATE (
                SUMMARIZE (
                    'FACT Opportunity',
                    'FACT Opportunity'[header valid from],
                    'FACT Opportunity'[header valid to],
                    "Rows",
                    DISTINCTCOUNT ( 'FACT Opportunity'[Opp Number])
                ),
                DATESBETWEEN (
                    'DIM Date'[Date],
                    'FACT Opportunity'[header valid from],
                    'FACT Opportunity'[header valid to]
                )
            ),
            'DIM Date'[Date] = EARLIER ('DIM Date'[Date])
        ),
        [Rows]
    )
)

【问题讨论】:

    标签: sql-server ssas dax data-analysis tabular


    【解决方案1】:

    我想通了。我缺少一个 ALL() 函数来消除 CALCULATE() 函数完成的上下文转换。我还在 VALUES() 函数周围使用了 LASTDATE() 来获取任何给定上下文中的最后日期。这给了我层次结构中任何给定月份/季度/年的最后一个日期的总和。
    这是我使用的代码:

    Active Opps:=
    SUMX(
        LASTDATE( VALUES ( 'DIM Date'[Date] ) ),
        VAR CurrentDate = 'DIM Date'[Date]
        VAR OrderedBeforeCurrentDate =
            FILTER (
                ALL ( 'FACT Opportunity'[header valid from]), 
                'FACT Opportunity'[header valid from] <= CurrentDate 
            )
        VAR ShippedAfterCurrentDate =
            FILTER (
                ALL ( 'FACT Opportunity'[header valid to] ), 
                'FACT Opportunity'[header valid to] >= CurrentDate 
            )
        RETURN
            CALCULATE (
                DISTINCTCOUNT( 'FACT Opportunity'[Opp Number]),
                OrderedBeforeCurrentDate,
                ShippedAfterCurrentDate,
                ALL ( 'DIM Date' )
            )
    )
    

    在这里找到模式:https://www.sqlbi.com/articles/analyzing-events-with-a-duration-in-dax/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多