Идентификатор поиска отсутствует в дате, представленной yyyyweek_number

#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:

Шаги:

  1. Создайте связь между идентификаторами клиентов в таблице Customer и таблице Order (если их там еще нет)
  2. Создайте таблицу дат
  3. Преобразовать недели в даты в новом вычисляемом столбце в таблице заказов
  4. Создать связь между идентификаторами клиентов в таблице Customer и таблице Order
  5. Создать связь между датами в таблице дат и таблице заказов
  6. Создайте вычисляемый столбец в таблице дат с диапазонами дней («30 дней или меньше» и т. Д.)
  7. Создайте показатель, чтобы определить, был ли размещен заказ
  8. Добавьте срез с диапазоном дат из таблицы дат и таблицы с идентификатором клиента.
  9. Добавьте меру в визуальную таблицу на панели фильтров и установите значение «Нет»

Некоторые из этих шагов имеют дополнительную информацию ниже.

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 и новый снимок экрана (фильтр установлен на «Нет»)