DAX - расчет на уровне линии (SUMX) с несколькими фильтрами - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь заставить DAX сделать следующее:

  1. Просматривать каждую строку в таблице данных HR.
  2. Определить дату начала сотрудника ("employee a ")
  3. Суммируйте количество других сотрудников в таблице с применением следующих фильтров:
    a.Успешно выполнили свое задание
    б.Закончили свое назначение ДО даты начала + 31
    c.Закончили свое назначение ПОСЛЕ начальной даты - 31 (то есть в течение месяца после начальной даты сотрудника а)
    d.Начинается до сотрудника a (чтобы не считать сотрудника a или кого-либо из их когорты в подсчете)
    e.Имеет ту же должность, что и работник a.

По сути, это вопрос на обычном английском языке: «для каждого из моих сотрудников, сколько других сотрудников с таким же названием успешно завершили свои назначения в течение месяца после начала работы этого сотрудника?»а в DAX это просто "как применить несколько критериев фильтра к столбцу меры / вычисляемого столбца SUMX или COUNTAX?"

Мера, которую я уже пробовал:

Contractors Available = COUNTAX(
'BAT VwRptMspAssignment',
    CALCULATE(
        DISTINCTCOUNT('BAT VwRptMspAssignment'[assignmentgk]),
        FILTER(
            FILTER(
                FILTER(
                    FILTER(
                        FILTER(ALL('BAT VwRptMspAssignment'),
                        'BAT VwRptMspAssignment'[End.Date]<EARLIER('BAT VwRptMspAssignment'[Start.Date])+31),
                    'BAT VwRptMspAssignment'[End.Date]>EARLIER('BAT VwRptMspAssignment'[Start.Date])-31),
                'BAT VwRptMspAssignment'[Start.Date]<EARLIER('BAT VwRptMspAssignment'[Start.Date])),
            'BAT VwRptMspAssignment'[EoaReason]="Successful Completion"),
        'BAT VwRptMspAssignment'[JobPostingTitle.1]=EARLIER('BAT VwRptMspAssignment'[JobPostingTitle.1]))
        )
    )

И пробный столбец, который я пробовал, был:

Contractors Available.1 = SUMX(
FILTER(
        FILTER(
            FILTER(
                FILTER(
                    FILTER(
                        FILTER(ALL('BAT VwRptMspAssignment'),
                            'BAT VwRptMspAssignment'[customergk]=EARLIER('BAT VwRptMspAssignment'[customergk])),
                        'BAT VwRptMspAssignment'[JobPostingTitle.1]=EARLIER('BAT VwRptMspAssignment'[JobPostingTitle.1])),
                        'BAT VwRptMspAssignment'[End.Date]<EARLIER('BAT VwRptMspAssignment'[Start.Date])+31),
                    'BAT VwRptMspAssignment'[End.Date]>EARLIER('BAT VwRptMspAssignment'[Start.Date])-31),
                'BAT VwRptMspAssignment'[Start.Date]<EARLIER('BAT VwRptMspAssignment'[Start.Date])),
            'BAT VwRptMspAssignment'[EoaReason]="Successful Completion"),

'BAT VwRptMspAssignment' [FinishFlag])

но ни одно из этих решений не сработало.
У кого-нибудь есть идеи, почему или что еще я могу попытаться сделать это?Пример формата данных, экспортируемых в Excel:

scrubbed data

«Подрядчики доступны. 2» - это вычисляемый столбец.Обратите внимание на 521 в первой строке.Если я применяю все эти фильтры в Excel, он должен быть равен нулю, это название должности является уникальным в наборе данных.В нем говорится, что 107 строк «Технический писатель - эксперт» должны были закончиться в течение месяца с 26.09.2017, но это только 3 технических писателя в наборе данных, и ноль из двух других закончили свои назначения в течение месяца 9 /.30/2016: enter image description here

1 Ответ

0 голосов
/ 24 сентября 2018

Попробуйте что-то вроде этого для вычисляемого столбца:

Contractors Available.1 =
VAR StartDate = 'BAT VwRptMspAssignment'[Start.Date]
VAR JobTitle = 'BAT VwRptMspAssignment'[JobPostingTitle.1]
RETURN
    COUNTROWS (
        FILTER (
            'BAT VwRptMspAssignment',
            'BAT VwRptMspAssignment'[End.Date] < StartDate + 31
                && 'BAT VwRptMspAssignment'[End.Date] > StartDate - 31
                && 'BAT VwRptMspAssignment'[Start.Date] < StartDate
                && 'BAT VwRptMspAssignment'[EoaReason] = "Successful Completion"
                && 'BAT VwRptMspAssignment'[JobPostingTitle.1] = JobTitle
        )
    )

Функции EARLIER не нужны, поскольку переменные будут сохранять контекст, в котором они были определены, то есть rowcontext.

РЕДАКТИРОВАТЬ: Я проверил мою формулу с данными, которые вы предоставили, и, кажется, работает.Я изменил [End.Date] во втором ряду, чтобы получить результат в первом ряду.

enter image description here

...