Desafío DAX: recuento de ID únicos donde la suma de otro valor es > 0

Un usuario Pregunto ✅

cadalano

Tengo un problema que actualmente puedo resolver en SQL, pero me gustaría encontrar una manera de realizar el mismo cálculo usando DAX contra los datos. Básicamente, necesito obtener un recuento distinto de ID donde la suma de otro valor en los datos (por ID) sea mayor que cero.

si hubiera una función DISTINCTCOUNTX en DAX, parece que sería útil aquí. Desafortunadamente no hay – ¿alguien familiarizado con este problema o una solución?

Aquí hay un ejemplo de código SQL que demuestra el problema y cómo lo resuelvo en SQL

— Supongamos que #tmpData es una lista de Personas que, durante determinados períodos,
— se pagaron cantidades que posteriormente podrían ser negadas en líneas separadas en la tabla.

— tabla de datos de muestra crear y completar a continuación….
SI OBJECT_ID(N’tempdb..#tmpData’) NO ES NULO
COMENZAR
DROP TABLE #tmpData
FIN

SELECCIONE 12345 personID, período de asignación de ‘febrero’, 4.50 cantidad de asignación EN #tmpData UNION TODO
— a la persona 12345 se le niega el monto de febrero, pero se reemplaza
SELECCIONE 12345 ID de persona, período de asignación de ‘febrero’, -4.50 monto de asignación UNION todo
SELECCIONE 12345 ID de persona, período de asignación de ‘febrero’, 3.50 monto de asignación UNION todos
SELECCIONE 12345 personID, período de asignación de ‘marzo’, 3.50 monto de asignación UNION ALL

— la persona 23456 tiene pagos de febrero y marzo. Nada especial eliminado.
SELECCIONE 23456 ID de persona, período de asignación de ‘febrero’, 3.50 monto de asignación UNION todos
SELECCIONE 23456 ID de persona, período de asignación de ‘marzo’, 3,50 monto de asignación UNION ALL

— la persona 34567 tiene su cantidad negada y NO reemplazada para febrero
SELECCIONE 34567 personID, período de asignación de ‘febrero’, 3.50 monto de asignación UNION ALL
SELECCIONE 34567 ID de persona, período de asignación de ‘febrero’, -3.50 monto de asignación UNION todo
SELECCIONE 34567 ID de persona, período de asignación de ‘marzo’, 3.50 monto de asignación

— Recuento necesario de personas únicas a las que finalmente se les pagó algo (cantidad de asignación > 0), por período.
— ejemplo de cálculo como tSQL – Estoy tratando de encontrar una manera de hacer esto en DAX como medida
SELECCIONE
— evaluar si la suma de la cantidad de la persona es mayor que cero. Considere a esa persona como una persona «pagada» si es así.
CONTAR( DISTINTO
IIF(jPersonPeriodSums.allocationAmount_Sum > 0
, jPersonPeriodSums.personID
, NULO)
) personas pagadas
, jPersonPeriodSums.allocationPeriod
DESDE
(
–subconsulta para obtener la suma por persona, por período
SELECCIONE
SUMA(importeAsignación) Importe_Asignación_Suma
, ID de persona
, período de asignación
DESDE #tmpData
AGRUPAR POR
ID de persona
, período de asignación
) jPersonPeriodSums
AGRUPAR POR
jPersonPeriodSums.allocationPeriod

Owen Auger

En respuesta a cadalano

@cadalano

Normalmente escribiría una medida como

=
COUNTROWS (
    FILTER (
VALUES ( Table[id] ),
CALCULATE ( SUM ( Table[FilterValue] ) ) > 0
) )

Saludos,

Owen

Anónimo

Prueba esto

medida =
CUENTAS (
DISTINTO ( CALCULABLE ( VALORES ( Tabla[Id] ), Tabla[FilterValue] > 0 ) )
)

cadalano

En respuesta a Anónimo

Gracias ThomasFoster. Eso parece muy prometedor, sin embargo, creo que se mantiene en la última parte de su fórmula.

CUENTAS (
DISTINTO ( CALCULABLE ( VALORES ( Tabla[Id] ), Tabla[FilterValue] > 0 ) )
)

La sección resaltada solo parece funcionar si está haciendo referencia a un valor de columna; en mi caso, necesito hacer referencia a un agregado. La suma de la cantidad

Algo como esto:

CUENTAS (
DISTINTO ( CALCULABLE ( VALORES ( Tabla[Id] ), Suma(Tabla[FilterValue]) > 0 ) )
)

Pero, esa fórmula me da un error:

«SUM se ha utilizado en una expresión Verdadero/Falso que se utiliza como expresión de filtro de tabla. Esto no está permitido»

cadalano

En respuesta a cadalano

Esto parece funcionar exactamente como lo necesitaba. ¡Gracias, Owen!

Owen Auger

En respuesta a cadalano

@cadalano

Normalmente escribiría una medida como

=
COUNTROWS (
    FILTER (
VALUES ( Table[id] ),
CALCULATE ( SUM ( Table[FilterValue] ) ) > 0
) )

Saludos,

Owen

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *