Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Icon for Administrator rankAdministrator
8 months ago

Replicando consultas SQL en Power BI

Básicamente quiero replicar en Power BI.

Dado que las tablas calculadas no son compatibles con DirectQuery,
¿cuál es el mejor enfoque basado en medidas en Power BI para replicar esta lógica?

Cualquier orientación o buenas prácticas sería bienvenida.

Gracias de antemano.

SELECT
emp. Apellido,
emp. NombreNombre,
emp. JobCode,
emp. Clase de trabajo,
emp. IDempresa,
emp. EmployeeID,
Detet. DetailCode,
Detet. TasaImporte,
Detet. LimitAmount,
Detet. VendorID
DE EmployeeTable AS emp
IZQUIERDA DE UNIR EmployeeDetailTable AS det
ON EMP. EmployeeID = det. EmployeeID
Y EMP. CompanyID = det. Compañía
DÓNDE
(dete. DetailCode = 'XXX' OR deton. DetailCode ES NULO)
Y EMP. IDempresa = 'YY'
Y EMP. IsActive = 'Y'
Y EMP. Código de trabajo COMO '%ZZZ%'
ORDENAR POR
emp. Código de trabajo ASC,
emp. ASC de Clase Laboral; y SELECT CompanyID, PeriodEndDate, EmployeeID, DetailCode
DE (
SELECT
IDempresa,
PeriodFechaFinal,
EmployeeID,
DetailCode,
ROW_NUMBER() CAMBIO (
PARTICIÓN POR EmployeeID, DetailCode
ORDEN POR PeriodFecha de Fin DESC
) COMO ROW_NUMBER
DE PayrollDetailTable
DÓNDE
PeriodEndDate <= 'MM/DD/YYYY'
Y Cantidad > 0
Código de detalle y entre 'aaaa' y 'bbbb'
Y EmployeeID EN (
/* lista de enmascarados */
)
) t
DONDE t.ROW_NUMBER = 1
PEDIDO POR EmployeeID ASC, Código de Detalle ASC;

5 Replies

  • Esto @कौशिक7जेपी ,

    Si quieres crear esta tabla en Power BI usando consulta directa, puedes usar esta misma sentencia SQL; solo necesitas usar las opciones avanzadas en la conexión SQL y pasar tu código SQL en la ventana que muestra la consulta SQL:

    Si esto no es lo que necesitas, ¿puedes explicar mejor qué quieres lograr y cómo está configurado tu modelo? Ya que no hay sintaxis directa entre SQL y las consultas DAX

  • Hola @Kaushik7jp
    @MFelix Gracias por la aclaración compartida arriba.

    Usar la sentencia SQL en las opciones avanzadas con DirectQuery responde al requisito y preserva la lógica SQL original. Si el objetivo difiere de este enfoque, detalles adicionales sobre la configuración del modelo y la salida esperada ayudarían a aclarar los siguientes pasos.

    Si aún necesitas ayuda, estaremos encantados de ayudarte a ti o a cualquier otro problema nuevo, puedes abrir un nuevo hilo en la comunidad en cualquier momento.

    Agradecemos tu comprensión y participación.

    Gracias y un saludo,
    Cheri Srikanth
    Equipo CST.



  • Esto @कौशिक7जेपी ,

    Aunque v-csrikanth y MFelix tienen razón en que pegar el SQL en el conector es la forma más rápida de obtener la tabla, a menudo no es la mejor forma para DirectQuery. Pegar SQL complejo impide el plegado de consultas, lo que reduce el rendimiento, y hace que el informe sea estático (no puedes cambiar dinámicamente esa fecha de 'MM/DD/AAAAA' usando un slicer).

    Como preguntaste por el enfoque basado en medidas, aquí tienes cómo traduces la lógica SQL a modelos semánticos de Power BI.

    1. La "Unió Izquierda" (Consulta 1)

    En Power BI, no se escribe código para unirse. Dependes del modelo.

    • Pensamiento SQL: Escribe IZQUIERDA UNIRSE a EmployeeDetailTable ON ...

    • Pensamiento en Power BI: Crea una relación entre EmployeeTable (One) y EmployeeDetailTable (Many).

      • Nota: Si tu clave de unión es compuesta (EmployeeID + CompanyID), debes crear una columna de "Clave compuesta" en ambas tablas de la vista de tu fuente de datos (por ejemplo, EmpID-CompanyID) para formar la relación, ya que Power BI solo soporta relaciones de una sola columna.

    Una vez relacionado, simplemente arrastra columnas de ambas tablas a un Gráfico de Tabla. El comportamiento de "Unirse por la izquierda" ocurre automáticamente (las filas sin detalles mostrarán espacios en blanco).

    Para replicar los filtros de la cláusula WHERE:

    • JobCode, CompanyID: Arrastra estas columnas al panel "Filtros en este visual" y selecciona los valores (YY, ZZZ).

    • La lógica "o" (XXX o NULL): Esto es complicado en los filtros. Usa una medida para el valor que maneja la lógica:

      Display_Rate = 
      CALCULATE(
          SUM(EmployeeDetailTable[RateAmount]),
          -- Filter: Keep row if Code is XXX or the row is from the 'Left' side (Blank)
          EmployeeDetailTable[DetailCode] = "XXX" || ISBLANK(EmployeeDetailTable[DetailCode])
      )

    2. El "número de fila / n superior" (consulta 2)

    Este es el desafío más común de SQL a DAX. Quieres el "Último Récord" por empleado. En SQL, se usa ROW_NUMBER(). En Power BI, usas una medida para marcar la última fila.

    La medida: Crea esta medida y añádela a tu Tabla Visual como un filtro de nivel visual configurado a 1.

    Is Latest Record = 
    VAR _SelectedDate = MAX(PayrollDetailTable[PeriodEndDate])
    VAR _MaxDateForGroup = 
        CALCULATE(
            MAX(PayrollDetailTable[PeriodEndDate]),
            -- Remove filters from Date, keep filters on Employee/DetailCode
            ALLEXCEPT(PayrollDetailTable, PayrollDetailTable[EmployeeID], PayrollDetailTable[DetailCode]),
            -- Replicate the "WHERE Date <= X" logic dynamically
            PayrollDetailTable[PeriodEndDate] <= MAX('DateSlicer'[Date]) 
        )
    
    RETURN 
        IF(_SelectedDate = _MaxDateForGroup, 1, 0)

    Por qué esto es mejor:

    • Dinámico: La parte MAX ('DateSlicer'[Date]) significa que tus usuarios pueden cambiar la fecha de corte usando un Date Slicer estándar, y la lógica de "Último Registro" se actualiza al instante. El método SQL paste no puede hacer esto.

    • Rendimiento: Permite a Power BI enviar consultas nativas para la agregación en lugar de extraer primero una tabla SQL gigante.

    ¡Espero que esto te guíe hacia la "forma de pensar Power BI"!


    Si mi respuesta ha resuelto tu duda, por favor márcalo como la Solución Aceptada para ayudar a otros. Además, agradecería un 'Kudos' si te ha resultado útil mi respuesta.
    Esta respuesta fue asistida por IA para fines de traducción y formato.

  • Hola @Kaushik7jp
    Solo quería hacer un seguimiento y comprobar si has tenido oportunidad de verificar las soluciones mencionadas anteriormente. Por favor, dime si necesitas alguna aclaración adicional por nuestra parte.

    Gracias y saludos,
    Cheri Srikanth
    Equipo de Apoyo Comunitario.

  • Esto @कौशिक7जेपी

    Esperamos que estés bien. ¿Podrías confirmar si tu problema se ha resuelto o si sigues teniendo problemas? Tu actualización será valiosa para la comunidad y puede ayudar a otros con preocupaciones similares.

    Gracias.