Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Icon for Administrator rankAdministrator
4 years ago

Equivalente de SQL Inner Query en DAX para la mutación de empleados

Así que el problema es este. Cada semana tengo que crear un informe sobre la posición de cada empleado en cada departamento. Así que básicamente los grabo en Excel con este formato.

Campo1 : CurrentWeekNumber (Texto)
Campo2 : EmployeeName (Texto)
Campo3 : Departamento (Texto)

Esa actividad seguramente producirá muchos valores redundantes en todos los campos, especialmente cuando nadie realmente muta a otros departamentos. Pero en el informe, siempre debe escribirse.

Así que quiero replicar este concepto usando DAX. Solo quiero ingresar una vez y dejar que DAX genere el informe utilizando el concepto "CrossJoin", entre los números de semana y los nombres de los empleados. Así que unssume tengo una tabla de empleados que rastrea la mutación de los empleados, como esta:


Nombre de la tabla : Empleado

Campo1 : Nombre (Texto)
Campo2 : Departamento (Texto)
Campo3 : StartDate (Datetime)
Campo4 : Fecha de finalización (Datetime)


Nombre de la tabla : YearWeek

Campo1 : Semana (Texto)



¿Cómo produzco la tabla verde con DAX, si solo tengo la tabla naranja y la tabla azul como entrada para DAX?

Por supuesto, la tabla verde es solo ilustrativa. El repot real se mostrará de W01 a W52 durante todo el año. He usado la función de unión cruzada, pero luego me quedé atascado. En SQL, puedo escribir una consulta interna para comparar la semana actual con la fecha de inicio y la fecha de finalización. Pero en DAX, es muy confuso.

¿Alguien puede ayudar?

3 Replies

  • @pelangi , Si la semana se basa en la fecha de inicio, primero cree la semana en el mismo formato

    YearWeek = Formato([Fecha de inicio], "YYYY-\W") & format(weeknum([Fecha de inicio],2) ,"00")

    Crear una combinación en la vista Modelo y, a continuación, utilizarla en visual

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      ¿Podría dar más detalles sobre la "unión en la vista modelo"?

      Aunque he cambiado "StartDate" y "FinishDate" al formato de semana, estos 2 campos indican la semana de inicio y la semana de finalización. No se pueden vincular mediante la relación de tabla convencional, con la tabla "YearWeek", en la vista de modelo. A menos que haya una característica en la vista del modelo, que no conozco.

  • @pelangi

    Puedes probar esta medida. Si el empleado está en dos posiciones en una semana (cuando la fecha de inicio no es una fecha de inicio de una semana), mostrará ambas posiciones en esa semana. _previousPosition y _nextPosition variables representan las dos posiciones. Puede modificar el resultado devuelto según sus necesidades.

    Department Position =
    VAR _weekStartDate = MIN ( 'Date'[Date] )
    VAR _weekEndDate = MAX ( 'Date'[Date] )
    VAR _onlyPosition =
        MAXX (
            FILTER (
                Employee,
                Employee[StartDate] <= _weekStartDate
                    && (
                        _weekEndDate <= Employee[FinishDate]
                            || ISBLANK ( Employee[FinishDate] )
                    )
            ),
            Employee[Department]
        )
    VAR _previousPosition =
        MAXX (
            FILTER (
                Employee,
                _weekStartDate <= Employee[FinishDate]
                    && _weekEndDate > Employee[FinishDate]
            ),
            Employee[Department]
        )
    VAR _nextPosition =
        MAXX (
            FILTER (
                Employee,
                _weekStartDate < Employee[StartDate]
                    && _weekEndDate >= Employee[StartDate]
            ),
            Employee[Department]
        )
    RETURN
        IF (
            NOT ( ISBLANK ( _previousPosition ) ),
            _previousPosition & "," & _nextPosition,
            _onlyPosition
        )
    

    Saludos
    Equipo de soporte de la comunidad _ Jing
    Si esta publicación ayuda, por favor acéptala como Solución para ayudar a otros miembros a encontrarla.