Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
6 years ago

SUMPRODUCT DAX

Hola

Tengo un cálculo fila por fila en Excel que es;

(IF(SUMPRODUCT(($U$2:$U3-U3)*($T$2:$T3-T3))>1,0,1))*TotalCoreHours

(IF(SUMPRODUCT(($U$2:$U4-U4)*($T$2:$T4-T4))>1,0,1))*TotalCoreHours

(IF(SUMPRODUCT(($U$2:$U5-U5)*($T$2:$T5-T5))>1,0,1))*TotalCoreHours

etcetera..

Me preguntaba si había un equivalente en Power BI, ya que debe ser fila por fila, como no podía ver en subprocesos anteriores?

He visto acerca de SUMx, pero no estoy seguro de si eso funcionaría de la misma manera

Gracias

Liam

9 Replies

  • @lherbert502

    Debe usarse como

    sumx(Table, Table[Col1]*Table[Col2]) *[Measure2]

    O

    sumx(Table, Table[Col1]*Table[Col2]*Table[Col3])

    • Anonymous's avatar
      Anonymous
      Not applicable

      Hola @amitchandak,

      Con el aspecto SUMPRODUCT contando el texto en EXCEL, ¿cómo evitaría este error?

      SUMPRODUCT.PNG

      Gracias de antemano

      Liam

  • Geradav's avatar
    Geradav
    Icon for Responsive Resident rankResponsive Resident

    Hola @lherbert502

    Ayúdanos a entender un poco mejor tu función.

    Su SUMPROD() es equivalente a un AND() lógico en el que se comparan todos los valores anteriores de una columna con el registro actual con el valor del registro actual para 2 columnas, la columna usted y la columna T.

    Si ambos,
    - un valor en un registro de la columna U hasta el registro actual es igual a la columna de registro actual U
    Y
    - un valor en el mismo registro de la columna T hasta el registro actual es igual a la columna de registro actual T

    Entonces

    el resultado debe ser 0

    Más

    Es 1

    En DAX es necesario identificar de forma única cada registro.

    A continuación, crearía una medida que se vería así:

    myMeasure =
    //Declare  variables storing the value of the current row for the column U and T in the current row context
      VAR currentRowColU = myTable[colName_U] 
      VAR currentRowColT = myTable[colName_T]
    
    RETURN
    IF (
      COUNTROWS (
        FILTER (
          myTable,
          myTable[colName_U] = currentRowColU
          && myTable[colName_T] = currentRowColT
        )
      ) > 1, 0, 1 * TotalCoreHours
    )

    Aunque es un poco difícil sin ver sus datos. ¿Podría proporcionar algunos datos de muestra para comprender mejor cómo podemos ayudar?

    Mejor

    David

    • Geradav's avatar
      Geradav
      Icon for Responsive Resident rankResponsive Resident

      En realidad, mi DAX debe actualizarse para filtrar primero la tabla hasta la fila actual antes de evaluar cada registro al valor de fila actual.

      David

    • Anonymous's avatar
      Anonymous
      Not applicable

      Hola @Geradav ,

      Muchas gracias por volver. He adjuntado la hoja de cálculo desde la que estaría trabajando.

      Enlace a hoja de cálculo

      Esencialmente sólo tiene que ser fila por fila mostrando 1280 o 0 por ejemplo en Power BI, por lo que tiene que ser por columna calculada si es posible.

      Espero que tenga sentido,

      Gracias

      Liam

      • Anonymous's avatar
        Anonymous
        Not applicable

        @Geradav

        Los datos de Power BI se replicarán en la hoja de cálculo

    • Anonymous's avatar
      Anonymous
      Not applicable

      @Geradav ,

      Lo que ha dicho es esencialmente bang on, simplemente no sé si es posible tener una fórmula para el nivel de columna calculado?

      Gracias

      • Geradav's avatar
        Geradav
        Icon for Responsive Resident rankResponsive Resident

        @lherbert502

        Se me ocurrió una columna calculada DAX de la siguiente manera:

        NewBookableHours = 
        VAR TotalBookableHours = 1280
        VAR CurrentRoom = ClassRoomTable[Room]
        VAR CurrentBuilding = ClassRoomTable[Building Name]
        VAR CurrentID = ClassRoomTable[ID]
        VAR PreviousBookingTbl =
        FILTER (
            ClassRoomTable,
            ClassRoomTable[ID] <= CurrentID
        )
        VAR CountExistingRecords =
        COUNTROWS (
            FILTER (
                PreviousBookingTbl,
                [Room] = CurrentRoom
                && [Building Name] = CurrentBuilding
            )
        )
        
        RETURN
        IF ( CountExistingRecords > 1, 0, TotalBookableHours )
            

        Tenga en cuenta que en esta instrucción DAX utilicé la columna ID para filtrar a registros anteriores que imaginaban que preceden naturalmente al registro actual.
        Sin embargo, podría tener una columna de fecha y hora que podría hacerlo mejor. Si ese es el caso, podría reemplazar la referencia a la columna ID con la columna de fecha y hora.

        Espero que sea útil

        Mejor


        David