Однофамильцы.

Иногда бывают ситуации, когда два или более объекта в таблице модели данных имеют одинаковые названия. Это могут быть имена сотрудников (полные однофамильцы), названия товаров, организаций и тому подобное. Идентифицировать такие записи как уникальные можно по уникальному коду — отдельному столбцу в таблице.

Но при отображении таких данных на дашборде могут возникнуть проблемы, связанные с особенностями работы DAX.
Рассмотрим вариант, как решить возможные проблемы.

Пример исходных данных:

Как видим, в нашей базе есть полные однофамильцы: Ивановы и Сидоровы.

Колонка «Код», скорее всего, для пользователя дашборда не несёт какой-либо полезной информации и её мы можем скрыть или удалить.

Получим такой результат:

DAX схлопнул записи с одинаковыми именами и теперь информация в таблице представлена не корректно.
Можно к имени сотрудника добавить его код, но это будет излишняя информация и удобство в работе она не прибавит.

Поступим иначе — добавим к имени сотрудника пробел нулевой ширины UNICHAR ( 8204 ). Количество пробелов будет зависеть от номера позиции однофамильца минус один.

То есть первому однофамильцу пробел не добавляется, второму однофамильцу добавляется один пробел, третьему — два пробела и так далее.

Такое решение визуально не захламляет данные — пользователь эти символы не видит, и не увеличивает длину строки, так пробелы имеют нулевую ширину.

Если бы мы добавляли обычные пробелы и у нас была большая база клиентов, где, возможно, нашлось бы несколько сотен однофамильцев, то длина строки стала бы несколько сотен символов.

Пробелы нулевой ширины не увеличивают длину строки.

Добавим в таблицу расчётную колонку:

Имя уник = 
VAR CustomersWithSameName =
    CALCULATETABLE (
        SUMMARIZE ( 'Продажи', 'Продажи'[Код], 'Продажи'[Сотрудник] ),
        ALLEXCEPT ('Продажи',  'Продажи'[Сотрудник] )
    )
VAR Ranking =
    RANKX ( CustomersWithSameName, 'Продажи'[Код],, ASC, DENSE )
VAR Blanks =
    REPT ( UNICHAR ( 8204 ), Ranking - 1 )
VAR Result =  'Продажи'[Сотрудник] & Blanks
RETURN
    Result

Теперь выведем данные в виде таблице, но вместо столбца «Сотрудник» используем столбец «Имя уник»:

Как видим, схлопывания данных не произошло, все сотрудники обработаны как уникальные, и лишней информации в таблице нет.

Столбцы можно переименовать, чтобы не смущать пользователя отчёта.

В некоторых языках пробелы нулевой ширины могут обрабатываться иначе, поэтому метод следует проверить, чтобы не сломать отчёт.

Кроме того, показанный метод можно использовать и для других целей, например, для реализации расширенных методов сортировки в иерархиях.

Статья подготовлена по материалам сайта SQLBI.

Рубрики: DAX

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *