Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Administrator
3 years ago

Convertir SQL en DAX

Estoy tratando de convertir el siguiente código SQL a DAX, no puedo obtener el mismo resultado que por SQL. ¿Podemos hacer esto en una sola medida o necesitamos dos medidas y luego restar?

Además, no puedo usar la función EXCEPTO en este caso

SELECT Count(DISTINCT( A.AccountNumber)) FROM factTable F
JOIN dimAccount A ON F.AccountKey = A.AccountKey y F.DateSk = A.DateSk
JOIN [dimDate] D on F.DateSk = D.DateSk
DONDE D.IsLastDayOfMonth = 1 y D.DateKey > '2020-11-30' y D.DateKey <= '2021-11-30'
e ISNULL(F.Sale ,0) = 0
y F.IsDeletetd = 'False'
y A.IsDeletetd = 'False'

y A.AccountNumber
NO EN(
SELECT DISTINCT(A.AccountNumber) FROM fact F
JOIN dimAccount A ON F.AccountKey = A.AccountKey y F.DateSk = A.DateSk
JOIN [dimDate] D on F.DateSk = D.DateSk
DONDE D.IsLastDayOfMonth = 1 y D.DateKey > '2020-11-30' y D.DateKey <= '2021-11-30'
e ISNULL(F.Sale ,0) > 0
y F.IsDeleted = 'False'
y A.Deleted = 'False'
)

5 Replies

  • ¿Entiendo correctamente que le gustaría tener un recuento distinto de números de cuenta, donde no hubo venta al final de cada mes?

    Para darle algún consejo, sería bueno que proporcionara información más detallada como: ¿están los datos de ventas en su tabla de datos por día (por lo que debe resumirlos al último día del mes)? ¿Cuál sería el contexto de su informe?

    Creo que no sería fácil darle una sola respuesta... especialmente si creo que también el SQL no tiene demasiado sentido (por ejemplo, ¿Por qué necesita poner la última condición WHERE (A.AccountNumber NOT IN( ...) ?... ¿No es suficiente la condición ISNULL(F.Sale ,0) = 0?)

  • Hola

    Comparta algunos datos, describa la pregunta y muestre el resultado esperado.

  • @amikm ,

    Para convertir el código SQL a DAX, puede probar el siguiente enfoque:

    Reemplace las cláusulas FROM y JOIN con una función FILTER que filtre las filas de las tablas relevantes en función de las condiciones de la cláusula WHERE.

    Reemplace las cláusulas SELECT y COUNT con una función CALCULATE que cuente los distintos valores AccountNumber mediante la función DISTINCTCOUNT.

    Esta es la medida DAX resultante:

    Recuento de números de cuenta distintos =

    CALCULAR(

    DISTINCTCOUNT(dimAccount[AccountNumber]),

    FILTRO(

    factTable,

    factTable[DateSk] = dimDate[DateSk]

    && dimDate[IsLastDayOfMonth] = 1

    && dimDate[DateKey] > "2020-11-30"

    && dimDate[DateKey] <= "2021-11-30"

    && ISBLANK(factTable[Venta])

    && factTable[IsDeleted] = FALSE

    && dimAccount[IsDeleted] = FALSO

    ),

    FILTRO(

    dimAccount,

    dimAccount[AccountKey] = factTable[AccountKey]

    && dimAccount[DateSk] = factTable[DateSk]

    )

    )

    Esta medida debería darle el mismo resultado que la consulta SQL.

    Nota: Reemplacé ISNULL(F.Sale ,0) = 0 con ISBLANK(factTable[Sale]) ya que DAX no tiene una función ISNULL. En DAX, puede usar la función ISBLANK para comprobar si un valor es NULL o una cadena vacía.

    ¡Espero que esto ayude! Avíseme si tiene alguna pregunta o si necesita más ayuda.

    Saludos

    Esteban Tao

    Si esta publicación ayuda, considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

  • Seleccione m.id, count(distinto a.id) total_calls
    desde el momento m
    unir moment_keywords k en k.moment_id = m.id
    Unirse a moment_mapping MP en mp.moment_keyword_id = k.id
    Unir transcripción t en t.id = mp.transcription_id
    Unir audio A en a.id = t.audio_id
    donde m.id = 215
    Agrupar por m.id

    ¿Alguien puede ayudarme a convertir esto en DAX? Tengo un total de 5 mesas desde la mesa de momento hasta la mesa de audio y tiene relaciones de muchos a uno entre todas ellas.
    Estoy buscando encontrar un recuento distinto de callids donde un solo momento id = 215 para una tarjeta visual.

  • ¿Puede ayudarme a convertir el siguiente SQL en una consulta DAX, será de gran ayuda!

    ```

    WITH course_lesson_counts AS (
    SELECT
    cl.course_id,
    COUNT(cl.lesson_id) AS total_lessons
    FROM course_lessons cl
    JOIN lessons l ON cl.lesson_id = l.id
    WHERE cl.publish_map_id IS NOT NULL AND l.publish_map_id IS NOT NULL
    GROUP BY cl.course_id
    ),
    halfway_users AS (
    SELECT
    ucp.course_id,
    ucp.user_id,
    COUNT(clp.lesson_id) AS completed_lessons
    FROM user_course_progress ucp
    JOIN course_lesson_progress clp ON ucp.user_id = clp.user_id AND ucp.course_id IN (
    SELECT course_id FROM course_lesson_counts
    )
    WHERE clp.progress_status IN ('in_progress', 'completed')
    GROUP BY ucp.course_id, ucp.user_id
    )
    SELECT
    c.id AS course_id,
    c.name AS course_name,
    COUNT(DISTINCT hu.user_id) AS halfway_user_count
    FROM courses c
    JOIN course_lesson_counts clc ON c.id = clc.course_id
    LEFT JOIN halfway_users hu ON c.id = hu.course_id AND hu.completed_lessons >= (clc.total_lessons / 2)
    WHERE c.publish_map_id IS NOT NULL
    AND c.paid_type = 'paid'
    GROUP BY c.id, c.name;