Всем привет! Прошу помощи у профессионалов. Имею модель данных и сводную таблицу. Пытаюсь разделить сумму по строке (факт) на значение в другом столбце (план) чтобы узнать процент выполнения плана. Уже всю голову сломал, не могу понять как это можно реализовать. В моем понимании должно быть что-то подобное: =COUNT('Таблица1'[ost])/sum([plan] ) Очень надеюсь на Ваши советы.
Енсей Танкадо, ой, 11 вчера спать пора, а не задачки решать Я хотела спросить, факт/ план должно отображаться во всей таблице, то есть где 1 , или только в общем итоге?
Енсей Танкадо, почему count, если вы хотите сумму факта посчитать? Посчитал сумму, а не количество. Сами замените, если уж я не прав . Заметьте, что вывод номенклатуры из Таблицы1 заметно усложняет расчет плана, так как фильтр распространяется в другую сторону. Приходится в мере включать двунаправленную фильтрацию:
Код
exec_plan :=
VAR f =
SUM ( 'Таблица1'[ost] )
VAR p =
CALCULATE (
SUM ( 'Таблица2'[plan] );
CROSSFILTER ( 'Таблица1'[id_fmcg_sku]; 'Таблица2'[id_fmcg_sku]; BOTH )
)
VAR result =
IF ( ISFILTERED ( 'Таблица1'[fmcg] ); f; DIVIDE ( f; p ) )
RETURN
result
upd: добавил расчет с количеством:
Код
exec_plan_2:=
VAR f =
COUNT ( 'Таблица1'[ost] )
VAR p =
CALCULATE (
SUM ( 'Таблица2'[plan] );
CROSSFILTER ( 'Таблица1'[id_fmcg_sku]; 'Таблица2'[id_fmcg_sku]; BOTH )
)
VAR result =
IF ( ISFILTERED ( 'Таблица1'[fmcg] ); f; DIVIDE ( f; p ) )
RETURN
result
Owlet, К сожалению, результат совпадает с моим только в данном частном случае, когда планы по всем SKU одинаковые (и то в итогах по SKU результат будет неверным). Дело в том, что VALUES() может возвратить скалярное значение только в том случае, если в столбце в текущем контексте фильтра одно уникальное значение. В остальных случаях это будет таблица. Мера выдаст ошибку, если хотя бы один план сделать не равным остальным.
surkenny, спасибо)) да, вы правы. лучше в таких случаях избегать включения двунаправленной фильтрации? Я бы через справочники соединяла и поля из справочников в сводную. Попробую переделать, интересно же
surkenny, добрый день! логика такая, что важен сам факт присутствия в определенном городе, сумма товара неважны, поэтому используется count. Ваше решение выглядит как то что нужно! Спасибо большое и продуктивного дня! llele, спасибо и Вам за уделенное время!
Уважаемые форумчане и уважаемый surkenny, а не подскажете, логика сводной таблицы позволяет не делать ничего в случае соблюдения условий фильтрации? Т.е. применительно к моему случаю, чтобы процент выполнения считался и выводился только для итоговой суммы (для последнего столбца)? Пока что оставил пустые кавычки в условии, но тогда под них сводник, понятное дело, выделяет отдельный столбец.
Код
IF ( ISFILTERED ( 'Таблица1'[fmcg] ); ""; DIVIDE ( f; p ) )
Енсей Танкадо написал: Пока что оставил пустые кавычки в условии, но тогда под них сводник, понятное дело, выделяет отдельный столбец.
Потому что "" - это не отсутствие значения. Используйте BLANK() вместо "":
Код
exec_plan:=
VAR f =
COUNT ( 'Таблица1'[ost] )
VAR p =
CALCULATE (
SUM ( 'Таблица2'[plan] );
CROSSFILTER ( 'Таблица1'[id_fmcg_sku]; 'Таблица2'[id_fmcg_sku]; BOTH )
)
VAR result =
IF ( ISFILTERED ( 'Таблица1'[fmcg] ); BLANK(); DIVIDE ( f; p ) )
RETURN
result
Либо не указывайте третий аргумент функции IF и в условии добавьте NOT:
Код
exec_plan_2:=
VAR f =
COUNT ( 'Таблица1'[ost] )
VAR p =
CALCULATE (
SUM ( 'Таблица2'[plan] );
CROSSFILTER ( 'Таблица1'[id_fmcg_sku]; 'Таблица2'[id_fmcg_sku]; BOTH )
)
VAR result =
IF ( NOT ISFILTERED ( 'Таблица1'[fmcg] ); DIVIDE ( f; p ) )
RETURN
result