Страницы: 1
RSS
Расчёт выполнения плана в сводной таблице (DAX)
 
Всем привет! Прошу помощи у профессионалов. Имею модель данных и сводную таблицу. Пытаюсь разделить сумму по строке (факт) на значение в другом столбце (план) чтобы узнать процент выполнения плана. Уже всю голову сломал, не могу понять как это можно реализовать. В моем понимании должно быть что-то подобное: =COUNT('Таблица1'[ost])/sum([plan] ) Очень надеюсь на Ваши советы.
Изменено: Енсей Танкадо - 26.05.2022 22:31:02
 
Енсей Танкадо, то есть план только в общих итогах отображается?
 
Owlet, добрый вечер! План находится в столбце plan. Факт - сумма элементов (единичек) в каждом городе (либо столбец "Общий итог")
 
Енсей Танкадо, ой, 11 вчера спать пора, а не задачки решать  :D
Я хотела спросить, факт/ план должно отображаться во всей таблице, то есть где 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
Изменено: surkenny - 26.05.2022 23:21:49
 
Owlet, у меня вот так вышло)
Цитата

кол-во_план:=
               Var k= COUNT('Таблица1'[ost])
Var f = VALUES('Таблица2'[plan])
Var Result = IF(ISFILTERED('Таблица1'[fmcg]);k;DIVIDE(k;f))
RETURN Result
Изменено: Owlet - 26.05.2022 23:41:40
 
Owlet,
К сожалению, результат совпадает с моим только в данном частном случае, когда планы по всем SKU одинаковые (и то в итогах по SKU результат будет неверным). Дело в том, что VALUES() может возвратить скалярное значение только в том случае, если в столбце в текущем контексте фильтра одно уникальное значение. В остальных случаях это будет таблица. Мера выдаст ошибку, если хотя бы один план сделать не равным остальным.
Изменено: surkenny - 27.05.2022 07:36:13
 
surkenny, спасибо)) да, вы правы. лучше в таких случаях избегать включения двунаправленной фильтрации?
Я бы через справочники  соединяла и поля из справочников в сводную. Попробую переделать, интересно же
Изменено: llele - 27.05.2022 08:47:12
 
llele, я бы просто использовал справочник. В данном случае Таблица 2 может быть и справочником, и таблицей фактов по плану.
Изменено: surkenny - 27.05.2022 09:16:38
 
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
Изменено: surkenny - 27.05.2022 11:07:49
Страницы: 1
Наверх