Power BI M 或 DAX - 将子查询(或度量)的结果与 table 的每一行汇总在一起,然后按日期汇总

Power BI M or DAX - Combine results of subquery (or measure) in aggregate with each row of a table, then roll up by date

我正在寻找一种方法来汇总 DAX 或 M 中子查询和时间序列随时间的聚合。我能想到的解决方案是在 DAX 聚合中按行应用度量,或者加入在 M 中的子查询表达式上,但我在文档中找不到执行此操作的函数。

一个例子SQL解决方案:

SELECT
    t1.Date,
    t1.Month,
    DailyOccupancy - Capacity 'Availability',
    r.Rate,
    (DailyOccupancy - Capacity) * r.Rate 'OverUnderCost'
FROM
    Rate r 
    INNER JOIN
(SELECT 
    d.Date,
    d.Month,
    SUM(c.Capacity) 'DailyCapacity',
    SUM(o.Occupancy) 'DailyOccupancy'
FROM
    DimDate d
    INNER JOIN Capacity c ON d.Date > c.StartDate AND d.Date < c.EndDate
    INNER JOIN Occupancy o ON d.Date = o.Date
GROUP BY
    d.Date,
    d.Month,
    r.Rate
) t1 ON o.Date = t1.Date

DAX 度量(在单个时间步长工作,但是当使用容量度量和一个月的占用率时,我得到一个容量值和 30 个占用值的总和)

DailyCapacity =
VAR currentDate = MAX ( DimDate[Date] )
RETURN
CALCULATE ( SUM('Capacity'[Capacity]),
FILTER ( 'Capacity',
( 'Capacity'[StartDate] <= currentDate
&& 'Capacity'[EndDate] >= currentDate )))

Available =  CALCULATE(SUM('Occupancy'[Occupancy]) - ('Capacity'[DailyCapacity ]))
(Works for each individual time step, doesn't roll up over time)

是否有 DAX 方法可以对每个时间步 的容量度量减去可用聚合 求和?

另一种方法是使用M创建"DailyCapacity"table。在 SQL:

SELECT 
    d.Date,
    SUM(c.Capacity) 'DailyCapacity',
FROM
    DimDate d
    INNER JOIN Capacity c ON d.Date > c.StartDate AND d.Date < c.EndDate
GROUP BY
    d.Date

但我找不到在 M 中加入布尔表达式的方法,只有键。有没有办法加入 布尔表达式 ,而不是 M 中的 keys

我的tables:

DimDate (Date, day, Month, Year, Billing Month, FY)
----------
1/1/2019, 1, 1, 2019, 1, 2019
1/2/2019, 2, 1, 2019, 1, 2019
... Every time step possible


Capacity (StartDate, EndDate, Capacity, Notes)
----------
1/1/2019, 12/31/2019, 40, "Annual Cap"
6/1/2019, 9/15/2019, 30, "Summer Peak"

Occupancy (Date, Occupancy, Location)
----------
1/1/2019, 20, 1
1/1/2019, 17, 2
1/2/2019, 30, 1
1/2/2019, 9, 2
1/3/2019, 22, 1
1/3/2019, 20, 2

Rate (Date, Rate)
----------
1/1/2019, .99
1/2/2019, .99
... etc. 

需要输出

Available Space:
----------
1/1/2019, 3
1/2/2019, 1
1/3/2019, -2
1/4/2019, 0

并汇总时间步长:

SUM(Available Space * 当前日汇率) 每月、每季度、每年等。包括超过和低于容量的总计为负和正。

要在 DAX 中执行此操作,让我们编写一个 DailyCapacity 度量(与您的非常相似),我们将在另一个度量中使用它。 (我在这里使用 SELECTEDVALUE 所以如果我处理多个值会更明显,但你的 MAXSUM 也应该有效。)

DailyCapacity =
VAR currentDate = SELECTEDVALUE ( DimDate[Date] )
RETURN
    CALCULATE (
        SELECTEDVALUE ( Capacity[Capacity] ),
        FILTER (
            Capacity,
            Capacity[StartDate] <= currentDate &&
            Capacity[EndDate] >= currentDate
        )
    )

现在计算可用 space,我们将遍历 Occupancy 的每一行并调用我们刚刚定义的度量(假设您的 DimDate table 有一个过滤 Occupancy).

的关系
AvailableSpace = SUMX ( Occupancy, [DailyCapacity] - Occupancy[Occupancy] )

此度量应按预期累积,因为它计算的是每一行的每日容量,而不仅仅是一次。

同样,如果您像 DailyCapacity 一样为 DailyRate 写一个度量,那么您可以写一个机会成本度量 SUMX ( DimDate, [AvailableSpace] * [DailyRate] )