DAX Получить последнюю дату с положительными продажами независимо от контекста строки даты - PullRequest
2 голосов
/ 08 апреля 2020

Как получить последнюю дату с продажами Сумма для всех дат между минимальной и максимальной датой с продажами Сумма. В таблице некоторые даты могут иметь нулевую сумму. Вот пример с ожидаемыми результатами:

enter image description here

Вот что я пробовал. Это все меры DAX.

LastDate = 
CALCULATE( 
    LASTDATE( Sales[Date] ), 
    REMOVEFILTERS( Sales[Date] ) 
)
LastNonBlank = 
CALCULATE( 
    LASTNONBLANK( Sales[Date], [Sales] ),
    REMOVEFILTERS( Sales )
)
MaxDate = 
CALCULATE( 
    MAX( Sales[Date] ), 
    REMOVEFILTERS( Sales[Date] ) 
)
MaxDate_Filter = 
CALCULATE( 
    MAX( Sales[Date] ),
    FILTER( ALL( Sales ), Sales[Amount] > 0 )
)

И вот что я получаю с ним:

enter image description here

Так не из этих мер дает ожидаемые результаты.

Таблица для воссоздания проблемы:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjIwMtA1MAQiJR0lEIYLmCjF6iDJGwHl8EgbA+VM8cibAOWM8cibQoxXio0FAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Date = _t, Amount = _t, #"Expected Result" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Amount", Int64.Type}, {"Expected Result", type date}})
in
    #"Changed Type"

Обновление

Здесь я нашел интересную ссылку, которая решила мою проблему :

https://www.sqlbi.com/articles/hiding-future-dates-for-calculations-in-dax/

Добавляем вычисляемый столбец в таблицу продаж:

DatesWithSales = 
var CalendarDate = Sales[Date]
return
CalendarDate <= CALCULATE( MAX( Sales[Date] ), FILTER( ALLSELECTED( Sales ), Sales[Amount] > 0 ) ) &&
CalendarDate >= CALCULATE( MIN( Sales[Date] ), FILTER( ALLSELECTED( Sales ), Sales[Amount] > 0 ) )

Затем используем меру:

Expected Result = 
CALCULATE(
    MAX( Sales[Date] ),
    CALCULATETABLE(
        VALUES( Sales[Date] ), -- here can be whatever time intelligence function like SAMEPERIODLASTYEAR( Sales[Date] )
        Sales[DatesWithSales] = TRUE()
    )
)

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Ваш MaxDate_Filter выглядит хорошо. Если вы хотите исключить даты, превышающие это, вы можете выполнить

Expected Result =
VAR RowDate = SELECTEDVALUE ( Sales[Date] )
RETURN
    IF ( RowDate <= [MaxDate_Filter], RowDate )

или, если вы определили аналогичный [MinDate_Filter] и хотите выполнить фильтрацию с обеих сторон:

Expected Result =
VAR RowDate = SELECTEDVALUE ( Sales[Date] )
RETURN
    IF ( RowDate <= [MaxDate_Filter] && RowDate >= [MinDate_Filter], RowDate )
2 голосов
/ 08 апреля 2020

вы можете попробовать:

    Expected Result = 
var maxDate = CALCULATE(MAX(Sales[Date]), FILTER(Sales, NOT(ISBLANK(Sales[Amount]))))
return IF(Sales[Date]> maxDate,BLANK(),maxDate)

Сначала он вычисляет maxDate на основе всех строк со значением в Amount, а затем заполняет столбец maxDate, только когда Sales [Date] меньше или равна.

1 голос
/ 08 апреля 2020

Здесь я нашел интересную ссылку, которая решила проблему:

https://www.sqlbi.com/articles/hiding-future-dates-for-calculations-in-dax/

Добавляем вычисляемый столбец в таблицу продаж. В реальной модели этот столбец следует добавить в таблицу календаря.

DatesWithSales = 
var CalendarDate = Sales[Date]
return
CalendarDate <= CALCULATE( MAX( Sales[Date] ), FILTER( ALLSELECTED( Sales ), Sales[Amount] > 0 ) ) &&
CalendarDate >= CALCULATE( MIN( Sales[Date] ), FILTER( ALLSELECTED( Sales ), Sales[Amount] > 0 ) )

Затем мы используем меру:

Expected Result = 
CALCULATE(
    MAX( Sales[Date] ),
    CALCULATETABLE(
        VALUES( Sales[Date] ), -- here can be whatever time intelligence function like SAMEPERIODLASTYEAR( Sales[Date] )
        Sales[DatesWithSales] = TRUE()
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...