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
所以如果我处理多个值会更明显,但你的 MAX
和 SUM
也应该有效。)
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] )
。
我正在寻找一种方法来汇总 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
所以如果我处理多个值会更明显,但你的 MAX
和 SUM
也应该有效。)
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] )
。