#powerbi #dax #powerquery #powerbi-desktop
#powerbi #dax #powerquery #powerbi-рабочий стол
Вопрос:
У меня есть 2 набора данных, один из которых представляет список всех клиентов, а другой — даты их заказов. Дата заказа указана в формате yyyyweek_number, так что, например, поскольку сегодня (2020-09-29) — неделя 40, дата заказа будет представлена как 202040
Я хочу получить список дилеров, которые не размещали заказы в 4-дневных диапазонах, а именно. 30 дней или меньше 60 дней или меньше 90 дней или меньше и более 90 дней
Для иллюстрации предположим, что набор данных клиента выглядит следующим образом:
----
| ID |
----
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
----
и таблица заказов выглядит следующим образом:
---- -----------------
| ID | Order_YYYY_WEEK |
---- -----------------
| 1 | 202001 |
| 2 | 202003 |
| 3 | 202004 |
| 5 | 202006 |
| 2 | 202008 |
| 3 | 202010 |
| 6 | 202012 |
| 8 | 202009 |
| 1 | 202005 |
| 10 | 202015 |
| 11 | 202018 |
| 13 | 202038 |
| 15 | 202039 |
| 12 | 202040 |
---- -----------------
Формат среза, который у меня есть, выглядит следующим образом
Теперь, скажем, например, выбрана кнопка 30 дней или меньше, результирующая таблица должна представлять таблицу, указанную ниже, со всеми идентификаторами из таблицы Customer, которых нет в таблице ORDER, где ORDER_YYYY_WEEK составляет 30 дней с сегодняшней недели
----
| ID |
----
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 14 |
----
Ответ №1:
Шаги:
- Создайте связь между идентификаторами клиентов в таблице Customer и таблице Order (если их там еще нет)
- Создайте таблицу дат
- Преобразовать недели в даты в новом вычисляемом столбце в таблице заказов
- Создать связь между идентификаторами клиентов в таблице Customer и таблице Order
- Создать связь между датами в таблице дат и таблице заказов
- Создайте вычисляемый столбец в таблице дат с диапазонами дней («30 дней или меньше» и т. Д.)
- Создайте показатель, чтобы определить, был ли размещен заказ
- Добавьте срез с диапазоном дат из таблицы дат и таблицы с идентификатором клиента.
- Добавьте меру в визуальную таблицу на панели фильтров и установите значение «Нет»
Некоторые из этих шагов имеют дополнительную информацию ниже.
2. Создайте таблицу дат
Мы можем сделать это с помощью PowerQuery или в DAX. Вот версия DAX:
Calendar =
VAR
Days = CALENDAR ( DATE ( 2020, 1, 1 ), DATE ( 2020, 12, 31 ) )
RETURN
ADDCOLUMNS (
Days,
"Year Week", YEAR ( [Date] ) amp; WEEKNUM([Date])
)
Теперь пометьте эту таблицу как таблицу дат на ленте «Инструменты таблицы» кнопкой «Пометить как таблицу дат»
3. Преобразовать недели в даты
Чтобы это сработало, мне пришлось сначала создать вычисляемый столбец в таблице заказов с первым днем года. Вероятно, это можно улучшить.
StartYear = DATE(Left(Orders[Year week], 4), 01, 01)
Далее вычисляемый столбец, который нам нужен в таблице заказов, который идентифицирует первый день недели. Переменная «DayNoInYear» принимает номер недели, умноженный на 7, и вычитает 7, чтобы получить первый день недели, возвращая n-й день года. Затем он преобразуется в дату с переменной «DateWeek»:
Date =
VAR DayNoInYear = RIGHT(Orders[Year week], 2) * 7 - 7
VAR DateWeek = DATEADD(Orders[StartYear].[Date], DayNoInYear, DAY)
RETURN
DateWeek
6. Создайте вычисляемый столбец в таблице дат с диапазонами дней
Day ranges =
VAR Today = TODAY()
VAR CheckDate = 'Calendar'[Date] RETURN
SWITCH(TRUE(),
CheckDate - Today <= -90, "90 days",
CheckDate - Today <= -60 amp;amp; CheckDate - Today > -90 , "90 days or less",
CheckDate - Today <= -30 amp;amp; CheckDate - Today > -60 , "60 days or less",
CheckDate - Today <= 0 amp;amp; CheckDate - Today > -30 , "30 days or less",
"In the future"
)
7. Создайте показатель, чтобы определить, был ли размещен заказ
Yes - No order =
VAR Yes_No =
IF(
ISBLANK(FIRSTNONBLANK(Orders[Customer id], Orders[Customer id])),
"No",
"Yes"
)
VAR ThirtyDays = SELECTEDVALUE('Calendar'[Day ranges]) = "30 days or less"
VAR SixtyDays = SELECTEDVALUE('Calendar'[Day ranges]) = "30 days or less" || SELECTEDVALUE('Calendar'[Day ranges]) = "60 days or less"
VAR NinetyDays = SELECTEDVALUE('Calendar'[Day ranges]) = "30 days or less" || SELECTEDVALUE('Calendar'[Day ranges]) = "60 days or less" || SELECTEDVALUE('Calendar'[Day ranges]) = "90 days or less"
RETURN
SWITCH(TRUE(),
AND(ThirtyDays = TRUE(), Yes_No = "No"), "No",
AND(SixtyDays = TRUE(), Yes_No = "No"), "No",
AND(NinetyDays = TRUE(), Yes_No = "No"), "No",
Yes_No = "No",
"Yes"
)
Шаги 8 и 9
Создайте срез с вновь созданным столбцом «Диапазон дней» в таблице дат и создайте визуальную таблицу с мерой «Да — Нет порядка» в качестве фильтра визуального уровня, установленного на «Нет», как на скриншоте, прикрепленном ниже
Комментарии:
1. Привет, это почти работает так, как задумано, но моя главная цель здесь — показать все данные до сегодняшней даты, поэтому, например, если выбрано 60 дней или меньше, тогда должны отображаться данные от менее 30 или менее и от 30 до 60 дней, и так далее и тому подобное
2. Обновлена мера «Порядок да — Нет». Пожалуйста, попробуйте, если это поможет.
3. Также обновлен текст в разделе 8/9 и новый снимок экрана (фильтр установлен на «Нет»)