Power BI M или DAX - объединить результаты подзапроса (или показателя) в совокупности с каждой строкой таблицы, затем свернуть по дате - PullRequest
0 голосов
/ 25 октября 2019

Я ищу способ свертывания агрегатов по времени подзапроса и временного ряда в 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 Measures (работает на отдельном временном шаге, но когдаиспользуя меру Capacity и значение Occupancy за месяц, я получаю одно значение Capacity и суммируем 30 значений Occupancy)

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 для суммирования показателя Capacity за вычетом доступного агрегата для каждого* 1010 временного шага *?

Другой подход заключается в использовании M для создания таблицы «DailyCapacity». В 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, только ключи. Есть ли способ присоединиться к логическому выражению , а не к ключам в М?

Мои таблицы:

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, $49.99
1/2/2019, $64.99
... etc. 

Необходимые выходные данные

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

И агрегирует по свернутым временным шагам:

SUM (Доступное пространство * Курс текущего дня) за месяц, квартал, год и т. Д. Включая итоги избыточной и недостаточной мощности как отрицательные и положительные.

1 Ответ

1 голос
/ 25 октября 2019

Чтобы сделать это в DAX, давайте напишем меру DailyCapacity (очень похожую на вашу), которую мы будем использовать в другой мере. (Я использую SELECTEDVALUE здесь, так что это более очевидно, если я имею дело с более чем одним значением, но ваши MAX и SUM тоже должны работать.)

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

Теперь для расчета доступного пространства,мы будем перебирать каждую строку Occupancy и вызывать только что определенную меру (при условии, что у вашей DimDate таблицы есть отношение, которое фильтрует Occupancy).

AvailableSpace = SUMX ( Occupancy, [DailyCapacity] - Occupancy[Occupancy] )

Эта мера должна сворачиваться какожидается, так как он вычисляет ежедневную пропускную способность для каждой строки, а не только один раз.

Аналогично, если вы напишите показатель для DailyRate, как вы сделали для DailyCapacity, то вы можете написать показатель альтернативной стоимости SUMX ( DimDate, [AvailableSpace] * [DailyRate] ).

...