Evaluación de agrupación DAX

Aug 16 2020

En esta medida, estoy creando una tabla temporal para agrupar por ID de cliente y devolver el año de la fecha_pedido mínima para cada cliente. Luego quiero contar el número de clientes que aparecen en un año determinado (básicamente solo un recuento de filas).

Lo que me cuesta entender es que esta fórmula no parece mirar la SUMMARIZEtabla que contiene. Si pongo el año y esta medida en una matriz, cuenta en función de la tabla sin procesar, no de la versión agrupada creada SUMMARIZEen la fórmula. ¿Alguna idea de por qué está evaluando de esta manera?

COUNTROWS(
SUMMARIZE(
    Orders,
    Orders[Customer ID],
    "min_order_date_year",
    MIN(Orders[Order Date].[Year])))

Respuestas

1 mkRabbani Aug 16 2020 at 14:14

La fórmula está bien según la lógica que le proporcionó. Debe aclarar tanto su requisito como lo que está escribiendo en su código. Su fórmula está devolviendo exactamente lo que le está indicando.

Si entiendo correctamente, simplemente necesita el recuento de clientes para el año mínimo. Por ejemplo, si tiene 6 clientes únicos para el año 2019 y 11 clientes únicos para el año 2020, está buscando aquí el valor 6 para devolver según su medida.

Ahora, ¿qué es lo que realmente devuelve su tabla de resumen? si crea una tabla personalizada separada para el código de resumen solo como se muestra a continuación, puede ver que la tabla en realidad contendrá todo el nombre/identificación de su cliente en la primera columna y la segunda columna marcará el año MÍN. disponible para ese cliente.

orders_summarize = 
SUMMARIZE(
    Orders,
    Orders[customer id],
    "min_order_date_year",MIN(Orders[Order Date].[Year])
)

Entonces, básicamente, tiene una lista de todos los clientes en su tabla de resumen. Y ahora está contando filas de su tabla de resumen que en realidad está devolviendo el número total de clientes únicos.

Finalmente, si desea el recuento de clientes para un año específico (como el año MIN), siga estos pasos a continuación:

Paso 1: cree una tabla resumida personalizada como se muestra a continuación:

store_summarized_table = 
SUMMARIZE(
    store,
    store[Customer ID],
    "mindate",MIN(store[Order Date])
)

Paso 2: crear una medida como-

count_cust_id = COUNT('store_summarized_table'[Customer ID])

Paso 3: ahora configure sus elementos visuales de Matrix como se muestra en la imagen a continuación. También puede obtener la salida en la imagen-

Para evitar la mesa física, puede hacer esto a continuación:

Paso 1: cree una columna personalizada como se muestra a continuación:

is_min_year = 

// -- keep current row's customer id to a variable
VAR current_cust_id = store[Customer ID]
// -- keep current row's YEAR value to a variable
VAR current_year = store[Order Date].[Year]

// -- find the MIN YEAR from order date for the current row customer id
VAR min_year_current_custommer_id =  
CALCULATE(
    MIN(store[Order Date].[Year]),
    FILTER(
        store,
        store[Customer ID] = current_cust_id
    )
)

// -- check the current row's year is the MIN year of order date for the customer as well or not.
RETURN IF(current_year = min_year_current_custommer_id, 1,0)

O crear una medida como-

is_min_year_measure = 

VAR min_order_year_for_current_customer = 
CALCULATE(
    MIN(store[Order Date].[Year]),
    FILTER(
        ALL(store),
        store[Customer ID] = MIN(store[Customer ID])
    )
)

RETURN
IF ( MIN(store[Order Date].[Year]) = min_order_year_for_current_customer, 1,0)

Paso 2: cree una medida como se muestra a continuación:

Para la columna personalizada creada

count_cust_for_min_year = 
CALCULATE(
    DISTINCTCOUNT(store[Customer ID]),
    FILTER(
        store,
        store[is_min_year] = 1
    )
)

Por medida creada

count_cust_for_min_year = 
CALCULATE(
    DISTINCTCOUNT(store[Customer ID]),
    FILTER(
        store,
        [is_min_year_measure] = 1
    )
)

Ahora agregue "Fecha de pedido" y mida "count_cust_for_min_year" a su Matriz. La salida será la misma que se muestra a continuación.