2016-10-28 13 views
0

Очень новый для DAX/PowerPivot и столкнулся с дьявольски сложным вопросом в первый день.DAX работает на основе трех столбцов, один из которых является повторяющимся целым числом, всего

У меня есть некоторые данные (90 000 строк) Я пытаюсь использовать для вычисления совокупной оценки усталости для народных рабочих смен (используя PowerPivot/Excel 2016). В соответствии с приведенным ниже снимком экрана набор данных - это данные сдвига для нескольких сотрудников, у которых есть совокупное количество дней, отработанных против выходных дней, которые сбрасываются обратно до 1, когда они переключаются из одного состояния в другое, и столбца «Оценка», который в мои данные о производстве содержат меру их усталости.

Я хотел бы суммировать эту оценку усталости и сбросить ее, когда они перемещаются между состояниями «Дни работы» и «Дни». Мой желаемый результат находится в столбце «Желаемый» в правой части экрана, и я использовал зеленую подсветку, чтобы показывать работающие дни и выходные дни, а также добавить жирную границу вокруг отдельных блоков Emp_ID, чтобы продемонстрировать данные.

enter image description here

Существует некоторое сходство между моим вопросом и так оставлять на DAX running total (or count) across 2 groups исключением того, что один из моих колонок (то есть кумулятивные дни один) в повторяющейся последовательности от 1 до х. И Javier Guillén's post, вероятно, станет хорошей отправной точкой, если бы у меня было пару месяцев DAX под моим поясом, а не через пару часов, которые я получил сегодня.

Я едва могу приступить к концептуализации того, что должен был бы сделать DAX, учитывая, что я новичок DAX (мой фон - формулы VBA, SQL и Excel). Но чтобы кто-то ругал меня за то, даже не обеспечивая отправную точку, я попытался настроить следующий DAX на самом деле не имея понятия, что я делаю:

Cumulative:=CALCULATE( 
SUM(Shifts[Score]) , 
FILTER(Shifts,Shifts[Cumulative Days] <= VALUES(Shifts[Cumulative Days])) , 
ALLEXCEPT(shifts, Shifts[Workday],Shifts[EMP_ID])) 

Теперь я буду первым, чтобы признать, что этот код DAX эквивалент Infinite Monkey Theorem. И увы, сегодня у меня нет бананов, и я единственная надежда, что кто-то находит эту проблему подходящим пилингом.

ответ

0

Проблема с этой таблицей заключается в том, что невозможно определить, когда суммировать стоп при выполнении совокупного итога.

Я думаю, что один из способов его достижения - это рассчитать следующую первую дату, когда будет изменяться непрерывный рабочий день.

Например, статус рабочего дня в первых трех строках для EMP_ID 70073 одинаковый, до четвертой строки, дата 04-May, которая является датой изменения статуса рабочего дня. Моя идея - создать расчетный столбец, который найдет дату изменения статуса для каждой серии рабочих дней. Эта колонка позволяет нам реализовать кумулятивную сумму.

Ниже приведено выражение для рассчитанного столбца I по имени Helper.

Helper = 
IF (
    ISBLANK (
     CALCULATE (
      MIN ([Date]), 
      FILTER (
       'Shifts', 
       'Shifts'[EMP_ID] = EARLIER ('Shifts'[EMP_ID]) 
        && 'Shifts'[Workday] <> EARLIER ('Shifts'[Workday]) 
        && [Date] > EARLIER ('Shifts'[Date]) 
      ) 
     ) 
    ), 
    CALCULATE (
     MAX ([Date]), 
     FILTER (
      Shifts, 
      Shifts[Date] >= EARLIER (Shifts[Date]) 
       && Shifts[EMP_ID] = EARLIER (Shifts[EMP_ID]) 
     ) 
    ) 
     + 1, 
    CALCULATE (
     MIN ([Date]), 
     FILTER (
      'Shifts', 
      'Shifts'[EMP_ID] = EARLIER ('Shifts'[EMP_ID]) 
       && 'Shifts'[Workday] <> EARLIER ('Shifts'[Workday]) 
       && [Date] > EARLIER ('Shifts'[Date]) 
     ) 
    ) 
) 

Короче говоря, выражение говорит, что если расчет даты для текущего изменения рабочего дня серии возвращает blank использовать последнюю дату для этого EMP_ID ADING одну даты.

Обратите внимание, что нет способа рассчитать дату изменения для последней серии рабочих дней, в этом случае строки 08-May, поэтому, если вычисление возвращает пустое, это означает, что оно оценивается в последней серии, тогда мое выражение должно возвращать максимальное значение дату для этого EMP_ID, добавив один день.

После того, как вычисляемый столбец в таблице вы можете использовать следующее выражение для создания меры для кумулятивного значения:

Cumulative Score = 
CALCULATE (
    SUM ('Shifts'[Score]), 
    FILTER (ALL ('Shifts'[Helper]), [Helper] = MAX ([Helper])), 
    FILTER (ALL ('Shifts'[Date]), [Date] <= MAX ([Date])) 
) 

В таблице в энергетике BI (я не имею доступа к PowerPivot по крайней мере, восемь час) результат:

enter image description here

Я думаю, что есть простое решение, моя первая мысль была с помощью переменной, но поддерживаются только в DAX 2015, то вполне возможно, что вы не используя Excel 2016.

UPDATE: Оставляя только один фильтр в расчете на измерение. FILTER являются итераторами по всей таблице, поэтому использование только одного фильтра и логических операторов может быть более эффективным.

Cumulative Score = 
CALCULATE (
    SUM ('Shifts'[Score]), 
    FILTER (
     ALL ('Shifts'[Helper], Shifts[Date]), 
     [Helper] = MAX ([Helper]) 
      && [Date] <= MAX ([Date]) 
    ) 
) 

UPDATE 2: решение для сводных таблиц (матриц), так как предыдущее выражение работали только для визуализации табличной. Также измеренная экспрессия была оптимизирована для реализации только одного фильтра.

Это должно быть окончательное выражение для сводной таблицы:

Cumulative Score = 
CALCULATE (
    SUM ('Shifts'[Score]), 
    FILTER (
     ALLSELECTED (Shifts), 
     [Helper] = MAX ([Helper]) 
      && [EMP_ID] = MAX (Shifts[EMP_ID]) 
      && [Date] <= MAX (Shifts[Date]) 
    ) 
) 

Примечание: Если вы хотите игнорировать фильтры используют ALL вместо ALLSELECTED.

Результаты в Power BI Матрицы:

enter image description here

Результаты в PowerPivot сводной таблицы:

enter image description here

Дай мне знать, если это помогает.

+0

Hi Alejondro. Спасибо за очень хорошо написанный ответ. Я забыл сказать, что я использую Excel 2016, и что мой набор данных составляет 90 000 записей. Вычисляемый столбец отлично работает, но, возможно, из-за размера данных и довольно низкой спецификации, я запускаю его, мой экземпляр Excel говорил «Чтение данных ...» в течение некоторого времени, когда я добавил измерять до точки поворота. Я дам вам знать, сколько времени потребуется, если оно закончится. И я попробую это на меньшем подмножестве данных. Моим другим вариантом является вычисление совокупных показателей с использованием таблицы Excel и загрузка в PowerPIvot. – jeffreyweir

+0

Мне пришлось отменить обновление и повторить попытку подмножества данных. Но как с моими производственными данными, так и с данными этого образца я получаю отличный результат, чем ваш результат: поле «Кумулятивная оценка» возвращает то же самое, что и поле «Оценка». Таким образом, между PowerBI и PowerPivot должна быть некоторая несогласованность, если я не забыл настроить некоторые настройки. Когда у вас появится доступ к PowerPivot, мне было бы интересно посмотреть, работает ли он там для вас, или же вы получите тот же результат на платформе PP, что и я. – jeffreyweir

+0

@jeffreyweir, можете ли вы предоставить образцы данных, чтобы узнать, что вызывает проблему? Также попробуйте обновление, которое должно быть более эффективным, чем выражение начальной меры. –