Страницы: 1
RSS
DAX-мера для суммирования в группированных значениях по максимальной дате
 
Прошу помощи с созданием меры для суммирования по отфильтрованной таблице, которая будет отфильтрована по "Фамилия" + "Максимальная дата для фамилии". Есть таблица, как на скриншоте, которая связана с календарем. Если в календаре я выбираю ноябрь 2020, то в мере хочу увидеть сумму "Сумма" но уже над таблицей, которая представляла бы собой оставленные строки ноября с максимальными датами для каждой фамилии (то, что выделено красным). Размышляю в сторону GROUPBY, SUMMARIZE, но пока не получается соединить все это вместе.
 
Nyao, если Вам просто мера нужна, которая будет считать сумму на последнюю дату с данными в выбранном периоде, то:
Код
Мера =
CALCULATE (
    SUM ( 'Пример'[Сумма] ),
    LASTNONBLANK ( 'Календарь'[Date], COUNTROWS ( RELATEDTABLE ( 'Пример' ) ) )
)

И выводите матрицу, где под менеджером расположите месяц и день. В итоге месяца будет сумма за последнее число, на которое есть данные.
Изменено: surkenny - 18.12.2021 14:57:20
 
можно так, Но вы  забыли связывать таблицы (Пример- календарь)
Код
Measure1 = var _MaxDate=MAXX('Пример','Пример'[Дата])
        var _tablM= FILTER('Пример','Пример'[Дата]=_MaxDate)
return

  SUMX(_tablM,'Пример'[Сумма])
------------------
Measure2 =CALCULATE(SUM('Пример'[Сумма]),'Календарь'[Date]=MAX('Пример'[Дата]))
---------------

Measure3 = var _MaxDate=MAXX('Пример','Пример'[Дата])
    
return

  CALCULATE(SUM('Пример'[Сумма]),'Календарь'[Date]=_MaxDate)
Изменено: azma - 18.12.2021 15:04:23
 
Nyao, прошу прощения! В итогах по прошлой мере сумма будет некорректной (даты-то для всех фамилий разные). Подправил:
Код
Мера =
SUMX (
    VALUES ( 'Пример'[Фамилия] ),
    CALCULATE (
        SUM ( 'Пример'[Сумма] ),
        LASTNONBLANK ( 'Календарь'[Date], COUNTROWS ( RELATEDTABLE ( 'Пример' ) ) )
    )
)
Изменено: surkenny - 18.12.2021 15:23:36
 
Цитата
написал:
Подправил:
можно уточнить у Вас , почему выбрали такую меру когда можно попроще написать, или я что то не до понял?
 
azma, без агрегации по фамилиям Ваши меры (как и моя первая) дадут неверный результат в итогах. Последняя дата у всех разная.
Изменено: surkenny - 18.12.2021 17:07:40
 
Какая красота! surkenny, azma, огромное вам спасибо!
 
Цитата
azma написал:
почему выбрали такую меру когда можно попроще написать
Дальше хуже! Феррари и Руссо говорят, что в моей мере 2 итератора. И при большом числе фамилий мера будет медленной. А вот эта мера будет более быстрой :) :
Код
МераOptimized = 
VAR LastNameDate =
    ADDCOLUMNS (
        VALUES ( 'Пример'[Фамилия] ),
        "LastDate",
            CALCULATE (
                MAX ( 'Пример'[Дата] ),
                DATESBETWEEN ( 'Календарь'[Date], BLANK (), MAX ( 'Пример'[Дата] ) )
            )
    )
VAR FilterNamerDate =
    TREATAS ( LastNameDate, 'Пример'[Фамилия], 'Календарь'[Date] )
VAR SumLastSum =
    CALCULATE ( SUM ( 'Пример'[Сумма] ), FilterNamerDate )
RETURN
    SumLastSum
 
Для ТС домашнее задание: не обязательно оптимально, но переписать код меры так, чтобы для месяца она считала данные так же, а для триместра/четверти/года и тд - сумму месячных результатов (то есть сумму сумм за последнюю дату в каждом месяце). :)
Изменено: surkenny - 18.12.2021 19:26:23
 
Цитата
написал:
Для ТС домашнее задание
вот так?
Код
SUMX (
    SUMMARIZE('Пример','Пример'[Фамилия],'Календарь'[Date].[Год],'Календарь'[Date].[Месяц],'Календарь'[Date].[Квартал] ),
    CALCULATE (
        SUM ( 'Пример'[Сумма] ),
        LASTNONBLANK ( 'Календарь'[Date], COUNTROWS ( RELATEDTABLE ( 'Пример' ) ) )
    )
)
 
ещё вариант:
Код
МераOptimized = 
VAR LastNameDate =
    ADDCOLUMNS (
        SUMMARIZE (
            'Пример',
            'Пример'[Фамилия],
            'Календарь'[Date].[Год],
            'Календарь'[Date].[Месяц]
        ),
        "lastdate", CALCULATE ( MAX ( 'Пример'[Дата] ) )
    )
VAR SelectCol =
    SELECTCOLUMNS ( LastNameDate, "maxdate", [lastdate], "family", [Фамилия] )
VAR FilterNamerDat =
    TREATAS ( SelectCol, 'Календарь'[Date], 'Пример'[Фамилия] )
VAR SalesAmount =
    ADDCOLUMNS ( FilterNamerDat, "sales", CALCULATE ( SUM ( 'Пример'[Сумма] ) ) )
VAR SumLastSum =
    SUMX ( SalesAmount, [sales] )
RETURN
    SumLastSum
---------------
или так
Код
МераOptimized = 
VAR LastNameDate =
    ADDCOLUMNS (
        SUMMARIZE (
            'Пример',
            'Пример'[Фамилия],
            'Календарь'[Date].[Год],
            'Календарь'[Date].[Месяц]
        ),
        "lastdate", CALCULATE ( MAX ( 'Пример'[Дата] ) )
    )
VAR SelectCol =
    SELECTCOLUMNS ( LastNameDate, "maxdate", [lastdate], "family", [Фамилия] )
VAR FilterNamerDat =
    TREATAS ( SelectCol, 'Календарь'[Date], 'Пример'[Фамилия] )
VAR SalesAmount =
   CALCULATE(SUM('Пример'[Сумма]),FilterNamerDat)
RETURN
    SalesAmount

---------------
Изменено: azma - 18.12.2021 23:01:05
 
azma, это же для ТС :) Если хотите мнение о производительности - это Вам к Феррари у Руссо:) Я не смогу так понять. Вот сдам DA-100, пойду аналитиком pbi и начну прям в такие тонкости погружаться :)
Но последняя мне кажется отличной)
Изменено: surkenny - 18.12.2021 23:24:18
Страницы: 1
Наверх