#powerbi #dax #powerbi-desktop #measure
#powerbi #dax #powerbi-рабочий стол #измерение
Вопрос:
У меня вопрос о том, как рассчитать сумму последнего предыдущего рабочего дня.
Вот мой набор данных:
Date Name Amount
16/09/20 A 10
17/09/20 A 10
17/09/20 B 30
18/09/20 A 50
21/09/20 A 20
21/09/20 B 60
22/09/20 B 50
На моей панели инструментов у меня есть фильтр для выбора даты отображения, и я вижу сумму за сегодняшний день; последний предыдущий рабочий день и предпоследний предыдущий рабочий день.
Поэтому, когда я ставлю себя на дату 17/09/2020, я должен увидеть это:
- Сумма для D (17/09/2020) -> 40
- Сумма для D-1 (16/09/2020) -> 10
- Сумма для D-2 (15/09/2020) -> пусто
Когда я ставлю себя на дату 18/09/2020, я должен увидеть это:
- Сумма для D (18/09/2020) -> 50
- Сумма для D-1 (17/09/2020) -> 40
- Сумма для D-2 (16/09/2020) -> 10
Когда я ставлю себя на дату 21/09/2020, я должен увидеть это:
- Сумма для D (21/09/2020) -> 80
- Сумма для D-1 (18/09/2020) -> 50
- Сумма для D-2 (17/09/2020) -> 40
Я не нахожу способ суммирования за предыдущий день с помощью calculate или sum, и previousday в моем случае не помогает.
Заранее спасибо за помощь,
Комментарии:
1. Вам нужны эти 3 значения в 3 столбцах для каждой строки? или отдельное значение для отображения в КАРТОЧКЕ?
2. Я хотел бы получить три отдельных значения: D, D-1 и D-2. Идея заключалась бы в том, чтобы в конце иметь возможность увидеть результат D-(D-1), чтобы восстановить разрыв между двумя значениями.
3. что делать, если нет предыдущей доступной даты?
4. Если это нравится для D-2 даты 17/09/20, он может отображать пустой / пустой, это не важно
5. таким образом, оба d-1 и d-2 для даты 21/09/20 будут пустыми, верно?
Ответ №1:
Я настоятельно рекомендую добавить измерение даты в вашу модель. Это упростит аналитику на основе данных.
Вот моя первая попытка. Я предполагал, что праздничными днями являются только субботы и воскресенья. Если вам нужно учитывать другие праздники, вам понадобится таблица измерения дат. Также обратите внимание, что я использовал ALL(Data)
внутри CALCULATE
. Это удалит все фильтры, примененные к Data
таблице.
Output =
VAR _selectedDate =
MAX ( 'Data'[Date] )
VAR _selectedDateDay =
WEEKDAY ( _selectedDate )
VAR _selectedDateminus2 =
SWITCH (
TRUE,
_selectedDateDay = 2, _selectedDate - 4,
_selectedDateDay = 3, _selectedDate - 5,
_selectedDate - 2
)
RETURN
CALCULATE (
SUM ( 'Data'[Amount] ),
FILTER (
ALL ( 'Data' ),
'Data'[Date] <= _selectedDate
amp;amp; 'Data'[Date] >= _selectedDateminus2
)
)
Комментарии:
1. Привет, большое спасибо за эту идею, но я неправильно объясняю часть набора данных, я думаю. Это была выдержка, поскольку есть другое значение, которое я отредактировал в своем вопросе. Итак, я протестировал ваше решение, но min / max не работает.
2. Можете ли вы предоставить образец набора данных, для которого он не работает?
Ответ №2:
Создайте следующие 3 меры-
D_0 =
CALCULATE(
SUM('your_table_name'[Amount]),
FILTER(
ALL('your_table_name'),
your_table_name[Date] = SELECTEDVALUE(your_table_name[Date])
)
)
D_1 =
CALCULATE(
SUM('your_table_name'[Amount]),
FILTER(
ALL('your_table_name'),
your_table_name[Date] = SELECTEDVALUE(your_table_name[Date]) - 1
)
)
D_2 =
CALCULATE(
SUM('your_table_name'[Amount]),
FILTER(
ALL('your_table_name'),
your_table_name[Date] = SELECTEDVALUE(your_table_name[Date]) -2
)
)
Вот результат, когда вы выбираете дату «18/09/20» из слайсера-
Комментарии:
1. Привет, спасибо за ваше решение, но вы управляете предыдущим днем и последними 2 предыдущими днями, но не рабочим днем, который должен исключать субботу и воскресенье. Это работает для 18/09, но не для 21/09.
2. Это то, что я спросил. теперь, как вы определяете рабочий день? или мера, которая находит предыдущую доступную дату как D-1, подойдет для вас? Я имею в виду, что мера найдет предыдущую доступную дату независимо от пробелов.
3. Worday day — это все дни недели, кроме субботы и воскресенья. Я нашел решение, которое работает для меня, которое я опубликовал. Спасибо за вашу помощь
4. Голосование или принятие ответа — это реальное спасибо здесь 🙂 В любом случае приятно видеть, что вы получили решение. кстати, вы также можете принять свой собственный ответ, чтобы другие люди, посещающие здесь, могли понять, какой ответ является решением этой проблемы.
Ответ №3:
Я только что нашел решение, здесь я его публикую:
Для D:
wd = SUM(data[Amount])
Для D-1:
lwd =
var ad = DATEADD(data[Date];0;DAY)
var lwd = IF(
WEEKDAY(ad) = 1; //sunday
ad - 2;
IF(
WEEKDAY(ad) = 2; //monday
ad - 3;
ad - 1 //others
)
)
var sumLWD = CALCULATE(SUM(data[Amount]);data[Date]=lwd)
return sumLWD
Для D-2:
l2wd =
var ad = DATEADD(data[Date];0;DAY)
var lwd2 = IF(
WEEKDAY(ad) = 2; //monday
ad - 4;
IF(
WEEKDAY(ad) = 3; //tuesday
ad - 4;
ad - 2 //others
)
)
var sumLWD2 = CALCULATE(SUM(data[Amount]);data[Date]=lwd2)
return sumLWD2
Спасибо всем за вашу помощь и время.
С уважением,