Я создаю панель инструментов Tableau с «кнопками», которые окрашены в красный или зеленый цвет в зависимости от определенных критериев и того, что выбрано в фильтрах. Фильтры — это просто способ выбрать разные офисы в разных регионах, и при выборе офиса кнопки должны менять цвет в зависимости от того, были ли достигнуты цели для различных показателей для этого офиса или нет.
Кнопки навигации в Tableau не вмещают это, поэтому я сделал обходной путь. Для каждой «кнопки» я создал рабочий лист только с текстом имени метрики на метке «Ярлык» и вычисляемым полем на метке цвета. Затем я добавил рабочий лист на панель инструментов и добавил действие для перехода к соответствующей панели показателей при нажатии «кнопки».
У меня возникла проблема с условным окрашиванием одной из этих метрик. Этот показатель основан на уровне запасов. Для каждого офиса существует несколько категорий типов запасов, каждая с соответствующей целью, с несколькими «корзинами» в каждой категории. Я хочу, чтобы кнопка становилась красной, если ЛЮБОЙ общий объем запасов в корзинах для одной категории превышает целевой показатель для этой категории для этого офиса.
Чтобы попытаться ввести это логически- Для текущих отфильтрованных данных: ЕСЛИ СУЩЕСТВУЕТ(ДЛЯ КАЖДОГО ОФИСА( ДЛЯ КАЖДОЙ КАТЕГОРИИ: [СУММА(BinValue)<CategoryTarget])) THEN 'Зеленый' ELSE 'Красный'
Я попытался перевести эту логику в функции Tableau в вычисляемом поле и получил следующее: SUM(INT({INCLUDE [Category]:Min([CategoryTarget])} > {INCLUDE [Category]:SUM(BinValue)}))
Эта окраска правильная, когда я добавляю на лист таблетки «Название офиса» и «Категория», чтобы проверить свою логику, однако, когда я удаляю таблетки, окраска неверна. Кажется, что-то идет не так, когда я пытаюсь суммировать количество категорий, которые находятся в пределах целевых уровней по всем офисам и целям.
Я пробовал так много итераций следующих функций и уже несколько дней хожу по кругу: ВКЛЮЧИТЬ, ИСКЛЮЧИТЬ, ФИКСИРОВАННЫЙ, ЕСЛИ, СУММА, ЦЕЛОЕ
Если кто-нибудь знает, как это сделать правильно или хотя бы другой способ условного окрашивания кнопок на приборной панели, я был бы невероятно благодарен.
Структура моих данных выглядит следующим образом с некоторыми фиктивными данными в качестве примера:
Таким образом, для метрики «Уровень запасов» выбор любого из параметров фильтра «ВСЕ/Север/Северо-Запад/Манчестер» должен быть отмечен красным цветом из-за того, что общее количество ящиков в одной категории в офисе превышает целевое количество для этой категории для этого офиса.
Я обновил свое вычисляемое поле, однако у меня все еще возникают проблемы с группировкой, которая правильно отображается как истина/ложь. Это то, что есть сейчас: МАКС( {ВКЛЮЧИТЬ категорию, Офис: Сумма (BinValue)} > {ВКЛЮЧИТЬ Категорию, Офис: МИН (CategoryTarget)}) С True, отображаемым как Red и False Green (мы хотим быть ниже цели, поэтому зеленый).
@AnilGoyal - я добавил структуру данных, достаточно ли она подробная?
Итак, здесь бинсум составляет 70 против цели 50, и мы хотим покрасить игрушки в красный цвет! Я прав?
@AnilGoyal да, точно!
Саманта, не могли бы вы предоставить немного больше данных для работы! Эта проблема хоть и слишком многословна, но не кажется сложной
Да, я придумаю, как опубликовать и отправить ссылку. Спасибо
Смотрите мой ответ, работает ли он на ваших данных?
Чтобы работать с логическими условиями, такими как проверка того, выполняется ли условие для любой (или каждой) записи в группе строк данных, полезно понять, что Tableau рассматривает логическое значение «Истина» как большее, чем логическое значение «Ложь».
Как только вы освоитесь с этой идеей, вы можете использовать функции MAX() (или MIN()), чтобы проверить, выполняется ли условие для какой-либо записи (или для каждой записи соответственно). Так что MAX(False, False, True, False)
верно.
Итак, чтобы узнать, имеют ли какие-либо записи фактическое значение ниже целевого, проверьте MAX([Actual Value] < [Target Value])
Затем вы можете объединить эту идею с измерениями на визуализации (или расчетами LOD, если необходимо), чтобы соответствующим образом сгруппировать записи данных перед тестированием ваших условий. Если вы постоянно работаете с одними и теми же условиями, этот тип расчета может быть очень полезен для определения наборов, которые используются в нескольких местах.
Одно техническое предостережение: если ваш тест условия когда-либо оценивается как NULL, то эти нулевые значения игнорируются функциями MIN() и MAX() — точно так же, как это делают другие функции агрегирования. Так, например, вы можете проверить, удовлетворяет ли каждая запись условию, используя MIN(), и получить, возможно, вводящий в заблуждение результат, если все ненулевые значения равны True (поэтому MIN() сообщает True). MIN(TRUE, TRUE, NULL, TRUE) = TRUE
. Если ваше условие может оцениваться как NULL, и вы не хотите игнорировать нули, а вместо этого обрабатываете их, скажем, так же, как False, вы можете использовать функцию IFNULL(), чтобы предоставить значение по умолчанию для вашего условия.
Например, MIN(IFNULL([Actual Value] > [Target Value], FALSE))
возвращает значение True, только если каждая запись имеет значение выше целевого значения, рассматривая любые записи с отсутствующими значениями или целевыми значениями как не соответствующие условию, то есть не превышающие целевое значение. Выбор того, иметь ли значение по умолчанию для условия и каким оно должно быть, конечно, зависит от проблемы. Если ваши данные не имеют нулевых значений, вам не нужно учитывать эту сложность.
Благодарю за ваш ответ! Я отредактировал свое вычисляемое поле, чтобы включить ваше предложение. Это упростило код, но я все еще пытаюсь получить правильные результаты. Я считаю, что проблема связана с необходимостью группировать значения корзины по категориям для каждого офиса.
Можете ли вы опубликовать пример где-нибудь, например, в Tableau Public, а затем опубликовать ссылку здесь?
Хотя данных, которые вы дали, очень мало, все же я думаю, что это поле расчета вам нужно
IF { FIXED [Region], [Sub-Region], [Office], [Category] : SUM([Bin Value])}
> {FIXED [Region], [Sub-Region], [Office], [Category] : MIN([Category Target])} THEN 'RED' ELSE 'GREEN' END
Это основано на предположении, что для каждой группы region/sub-region/office/category
целевое значение будет одинаковым в каждой строке внутри группы. Поэтому MAX/AVG и т. д. будут работать вместо MIN
, используемых в расчетах.
Смотрите, я добавил две строки в ваши данные
и результат
При работе над примером для демонстрации проблемы мне удалось заставить его работать.
В итоге я использовал следующую логику: max({EXCLUDE [Bin]:SUM([Bin Value])} > [Целевая категория])
Это означало, что даже если большинство офисов в фильтре находились в пределах целевого уровня запасов, если был один с уровнем запасов выше целевого, «кнопка» отображалась красным.
Я опубликовал пример, который я все равно использовал, на случай, если он поможет другим в будущем. Ссылка на панель инструментов Tableau Public: https://public.tableau.com/views/ConditionalColouring/Dashboard1?:language=en-GB&:useGuest=true&:display_count=y&:origin=viz_share_link
Огромное спасибо за помощь!
Привет, добро пожаловать в SO. не могли бы вы поделиться своей структурой данных/данных. В противном случае повторите свою проблему с данными супермаркета.