Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Power Pivot. Суммироватние с нарастающим итогом по 2м условиям (дата и время).
 
Здравствуйте! Прошу указать на мою ошибку в формуле DAX (во вложении). Нужен аналог функции СУММЕСЛИМН, которая будет суммировать значения по 2м условиям (дата и время). Все это необходимо для расчета показателя нарастающим итогом за сутки по получасам.

В поиске нашел несколько подобных тем, где используются функции ALL и EARLIER. Я не совсем понимаю, что они делают и куда их нужно добавить к моей формуле. Буду благодарен за помощь.
 
EARLIER тут ни при чем, так как вы используете формулу в сводной, а не в вычисляемом столбце
Код
=
CALCULATE (
    SUM ( [Числитель] );
    FILTER (
        ALL ( 'Таблица1'[Дата]; 'Таблица1'[Время] );
        'Таблица1'[Дата] = MAX ( 'Таблица1'[Дата] )
            && 'Таблица1'[Время] <= MAX ( 'Таблица1'[Время] )
    )
)
F1 творит чудеса
 
Спасибо! Можете на пальцах объяснить каждый шаг в формуле, чтобы я смог понять логику?
 
Код
=
CALCULATE (                           /* функция которая вычисляет выражение в первом аргументе применив к нему фильтры из второго аргумента */
    SUM ( [Числитель] );           /* считаем сумму в контексте фильтров заданных ниже */
    FILTER (
        ALL ( 'Таблица1'[Дата]; 'Таблица1'[Время] );                 /* снимаем фильтры по дате и времени, которые задает сводная таблица */
        'Таблица1'[Дата] = MAX ( 'Таблица1'[Дата] )                  /* задаем новый фильтр по дате */
            && 'Таблица1'[Время] <= MAX ( 'Таблица1'[Время] )   /* задаем новый фильтр по времени */
    )
)
Вот горшок пустой, он предмет простой...
 
Большое спасибо! Удалось самому воссоздать данную формулу.
Код
CALCULATE(SUM([Числитель]);FILTER(ALL('Таблица1'[Дата]);'Таблица1'[Дата]=MAX('Таблица1'[Дата]));FILTER(ALL('Таблица1'[Время]);'Таблица1'[Время]<=MAX('Таблица1'[Время])))

Только я по прежнему не понимаю использование функции MAX при фильтрации времени. Все работает верно. Но почему мы в условиях задаем критерий <= MAX, ведь мы считаем нарастающим итогом с начала суток до времени, которое указано в каждой строке, а это время меньше чем MAX время в эти сутках.

Изменено: Murderface_ - 14 Июн 2019 10:33:06
 
Цитата
Murderface_ написал:
а это время меньше чем MAX время в эти сутках
Не в этих сутках, а в этой строке.
Выражение MAX('Таблица1'[Дата]) рассчитывается в стандартном контексте фильтра, т.е. вычисляется максимальное время для этой строки сводной, а вот когда CALCULATE начинает считать сумму, то сначала снимается фильтр сводной, а потом накладывается фильтр по дате и времени, таким образом для каждой новой строки сводной суммируются все строки, которые по времени случились раньше в разрезе конкретных суток.
Изменено: PooHkrd - 14 Июн 2019 11:08:53
Вот горшок пустой, он предмет простой...
 
Большое спасибо! Теперь все предельно ясно.
Изменено: Murderface_ - 14 Июн 2019 11:42:35
 
Здравствуйте! Обнаружил, что при включении общих итогов, итоговое значение считается некорректно, а именно оно равно последнему дневному значению. Это логично, ведь мы именно это и указывали в фильтре. Подскажите пожалуйста, как можно сделать, чтобы было все то же самое, но общий итог считался корректно?
 
Доброе время суток.
Offtop
Интересно, как могут сочетаться два утверждения
Цитата
Murderface_ написал:
Теперь все предельно ясно.
и
Цитата
Murderface_ написал:
Обнаружил, что при включении общих итогов, итоговое значение считается некорректно
Первое по-видимому ложное?
 
Цитата
Murderface_ написал:
итоговое значение считается некорректно ... Это логично, ведь мы именно это и указывали в фильтре
Как у вас такое в голове уживается рядом? Одно же исключает другое.
Цитата
Murderface_ написал:
как можно сделать, чтобы было все то же самое, но общий итог считался корректно?
Вы забыли показать в примере - что это значит с вашей точки зрения.
Изменено: PooHkrd - 17 Июн 2019 09:18:08
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
Как у вас такое в голове уживается рядом? Одно же исключает другое.
Я имел ввиду, что общий итог с учетом текущей формулы будет считаться именно так, как это происходит сейчас. В формуле мы используем 2 фильтра: максимальная дата и максимальное время, что будет равно итоговому значению максимальной даты в исходных данных.

Цитата
PooHkrd написал:
Вы забыли показать в примере - что это значит с вашей точки зрения.
В строке с общими итогами показатель за получас должен быть равен показателю с нарастающим итогом.
 
Цитата
Андрей VG написал:
Первое по-видимому ложное?
По дням в разрезе получасов все верно. Некорректен лишь общий итог.
 
Код
=
IF (
    ISFILTERED ( 'Таблица1'[Дата] );
    CALCULATE (
        DIVIDE ( SUM ( [Числитель] ); SUM ( [Знаменатель] ); 0 );
        FILTER (
            ALL ( 'Таблица1'[Время] );
            'Таблица1'[Время] <= MAX ( 'Таблица1'[Время] )
        )
    );
    DIVIDE ( SUM ( [Числитель] ); SUM ( [Знаменатель] ); 0 )
)
F1 творит чудеса
 
Большое спасибо! Работает. Вы не могли бы объяснить формулу по шагам, чтобы можно было понять ее логику.

Попробовал воссоздать формулу самостоятельно и у меня заработал ее более простой вариант:
Код
=CALCULATE(DIVIDE(SUM('Таблица1'[Числитель]);SUM('Таблица1'[Знаменатель]);0);FILTER(ALL('Таблица1'[Время]);'Таблица1'[Время]<=MAX('Таблица1'[Время])))
Изменено: Murderface_ - 17 Июн 2019 13:32:29
 
Murderface_, в принципе, и такой вариант возможен, исходя из логики вашей задачи.
Ваша формула считает вот эту простую формулу:
Код
DIVIDE(SUM('Таблица1'[Числитель]);SUM('Таблица1'[Знаменатель]);0)

применяя к ней фильтр по времени:
Код
FILTER(ALL('Таблица1'[Время]);'Таблица1'[Время]<=MAX('Таблица1'[Время]))

В обычной строке этот фильтр оставляет фильтр по дате, который идет из помещенного в строки сводной столбца Дата.
Но по времени он берет все строки времени, меньше-равно того, что у вас в той же строке сводной.
В подитоге (по дате) получается, что берутся все строки этой даты, так как максимальное время за эту дату как раз и есть последнее время суток
В общем итоге получается всё то же самое, что и в подитоге. Фильтра по дате в общем итоге больше нет, поэтому и фильтр по времени тоже берет все строки (ведь максимальное время всех строк как раз отберет все строки)
F1 творит чудеса
 
Максим Зеленский,спасибо Вам!
Страницы: 1
Читают тему (гостей: 4)
Наверх