TREATAS no funciona con SUM

Un usuario Pregunto ✅

marc_hll

Hola,

La siguiente relación virtual no funcionó, ¿es porque CustomerName no es una cantidad?

¿Cómo corregir esto?

Nombre del cliente =

CALCULAR(
SUMA(FactInternetSales[CustomerName]),
TRATAMIENTOS(VALORES(DimCliente[CustomerKey]), FactInternetSales[CustomerKey]))

Hola @marc_hll,

1.

CustomerName(Measure) = 
CALCULATE(
    MAX(FactInternetSales[CustomerName]),
    TREATAS( VALUES(DimCustomer[CustomerKey]), FactInternetSales[CustomerKey] )
)

v-lionel-msft_0-1602035522580.png

2.

Measure = 
CALCULATE(
    MAX(FactInternetSales[CustomerName]),
    TREATAS( VALUES(FactInternetSales[CustomerKey]), DimCustomer[CustomerKey] )
)

v-lionel-msft_1-1602035567501.png

Atentamente,
Lionel Chen

Si esta publicación ayudaentonces por favor considere Acéptalo como la solución. para ayudar a los otros miembros a encontrarlo más rápidamente.

Hola @marc_hll,

1.

CustomerName(Measure) = 
CALCULATE(
    MAX(FactInternetSales[CustomerName]),
    TREATAS( VALUES(DimCustomer[CustomerKey]), FactInternetSales[CustomerKey] )
)

v-lionel-msft_0-1602035522580.png

2.

Measure = 
CALCULATE(
    MAX(FactInternetSales[CustomerName]),
    TREATAS( VALUES(FactInternetSales[CustomerKey]), DimCustomer[CustomerKey] )
)

v-lionel-msft_1-1602035567501.png

Atentamente,
Lionel Chen

Si esta publicación ayudaentonces por favor considere Acéptalo como la solución. para ayudar a los otros miembros a encontrarlo más rápidamente.

watkinnc

A PESAR de que aparentemente está sumando texto, TREATAS necesita una de las columnas resultantes como entrada.

Nombre del cliente =

CALCULAR(
SUMA(FactInternetSales[CustomerName]); la columna de salida es FactInternetSales[CustomerName], por lo que debe ser uno de sus argumentos TREATAS, seguido de la columna en la otra columna de la tabla como desea tratar estos resultados. Además, si falta el valor de la columna de salida de la columna TRATAMIENTOS, ese valor seguirá sin estar ahí. TREATAS puede ser complicado.

pablodbrown

En respuesta a watkinnc

@watkinnc

No estoy seguro de haber entendido lo que dices, pero esta afirmación es, en el mejor de los casos, engañosa.

«CALCULAR(

SUMA(FactInternetSales[CustomerName]); la columna de salida es FactInternetSales[CustomerName]por lo que debe ser uno de sus argumentos TRATAS»

Los argumentos en TREATAS son columnas de tablas no relacionadas que desea «conectar» como una expresión de filtro (potencialmente una relación virtual uno a muchos o uno a uno, aunque la documentación en realidad simplemente define la primera entrada como «una expresión que da como resultado una tabla»)

En otras palabras, la «columna de salida» no necesita ser incluido en la expresión TRATAS en absoluto. En mi ejemplo,

Fact Customer Name = CALCULATE(
                    MAX(FactInternetSales[CustomerName]), 
                    TREATAS(VALUES(FactInternetSales[CustomerKey]), DimCustomer[CustomerKey]))

La «columna de salida» o resultado es diferente de los argumentos utilizados en la expresión TREATAS. Por supuesto, lo mismo sería cierto si se usara una medida de [Sum of Sales] por ejemplo (que sería la suma de una columna llamada ‘Tabla'[Sales])

En mi humilde opinión, la forma más fácil de entender TREATAS es pensar en ello como el establecimiento de una relación virtual de «uno» a muchos o «uno» a uno entre dos tablas que no están relacionadas en el modelo real (mediante el uso de VALORES o DISTINCT en el primer argumento – o FILTRO, etc.).

TREATAS bien puede ser más sofisticado de lo que pretendo, pero esta forma de pensar me facilita el uso de la función (que hago mucho).

watkinnc

En respuesta a pablodbrown

Trata las columnas de la tabla de entrada como columnas de otras tablas. Para cada columna, filtra los valores que no están presentes en su columna de salida respectiva.

Sintaxis

TRATAR COMO ( , [, <ColumnName> [, … ] ])

PARÁMETRO ATRIBUTOS DESCRIPCIÓN

Expresión

La expresión que genera el conjunto de columnas a reasignar.

nombre de columna repetible

El nombre de la columna de salida.

Valores devueltos

MESA Una tabla completa o una tabla con una o más columnas.

Una tabla que contiene todas las filas en columna(s) que también están en Expresión.

Compatibilidad

  • BI de energía
    Lanzamiento actual
  • SSAS tabular
    • SSA 2017
    • SSA 2019
  • Azure como
    Lanzamiento actual
  • SSDT
    Lanzamiento actual

» Mostrar compilaciones verificadas

Observaciones

TREATAS asigna el linaje de datos de las columnas devueltas por la expresión usando las columnas en los siguientes argumentos. El resultado se puede asignar a una variable, porque TREATAS no es un modificador de filtro. El primer argumento debe ser una expresión de tabla.

La función TRATAMIENTO funciona en Excel desde la versión 1809. Sin embargo, IntelliSense no informa sobre la función y es posible que Microsoft aún no la admita en Excel.

manikumar34

@marc_hll,

Estás haciendo una suma en valores de cadena. Intenta usar

DISTINCT o COUNT o DISTINCTCOUNT.

Y los valores de cadena no se pueden mostrar en gráficos como gráficos de barras, circulares, etc. Solo puede mostrarlos en tablas o matriciales, intente usar COUNT o DISTINCTCOUNT si desea mostrar los números.

Saludos,

Manikumar

marc_hll

En respuesta a manikumar34

Probé los tres, DISTINCT no funcionó, no obtuve ningún resultado, quería devolver una cadena en una tabla

El COUNT/DISTINCTCOUNT funciona pero como números

¿Me estoy perdiendo de algo?

marc_hll

En respuesta a marc_hll

Adjunté una muestra, intenté cambiar DISTINCT a VALUES pero aún no funciona

¿Cómo traigo CustomerName a la tabla DimCustomer usando una relación virtual? Cualquier ayuda es muy apreciada

https://1drv.ms/u/s!AjxzXMIO4yRIhSyLtp_PdyRqw4wu?e=u9cItr

NombreCliente = CALCULAR(
VALORES(FactInternetSales[CustomerName]),
TRATAMIENTOS(VALORES(DimCliente[CustomerKey]), FactInternetSales[CustomerKey]))

pablodbrown

En respuesta a marc_hll

@marc_hll

¿Qué estás tratando de hacer exactamente? ¿Cuál es su resultado esperado?

VALUES y DISTINCT devuelven una lista de valores, que no pueden ser la salida de una medida. Una medida debe devolver un solo valor. Puede usar VALUES o DISTINCT para crear una nueva tabla, por ejemplo, o como parte de una expresión de filtro en una medida.

marc_hll

En respuesta a pablodbrown

Este es el resultado esperado de la relación virtual, creé usando la columna pero recibo el error «Se proporcionó una tabla de valores múltiples donde se esperaba un valor único

Tal vez mi sintaxis sea incorrecta, veo que muchos blogs/publicaciones usan SUM con TREATAS/INTERSECT pero mi necesidad es una cadena (no una cantidad)

¿Puedes descargar el pbix de muestra?

marc_hll_0-1601796238958.png

pablodbrown

En respuesta a marc_hll

@marc_hll

No se puede tener una lista como resultado de una medida. Si necesita una cadena de valores, debe usar CONCATENATEX.
Para su caso, intente usar MAX en lugar de SUM en su medida

marc_hll

En respuesta a pablodbrown

Todavía no pude obtenerlo, ¿debería eliminar CALCULAR ya que no estoy calculando nada aquí? Solo estoy tratando de obtener un valor de cadena que es CustomerName con filtro/relación virtual. ¿Hay otra manera?

pablodbrown

En respuesta a marc_hll

@marc_hll

Usando el archivo que incluiste anteriormente, esto es lo que obtienes usando TREATAS en esta medida:

Fact Customer Name = CALCULATE(
                    MAX(FactInternetSales[CustomerName]), 
                    TREATAS(VALUES(FactInternetSales[CustomerKey]), DimCustomer[CustomerKey]))

Resultado de la medida TREATAS.JPG

Habiendo dicho eso, podría simplemente crear una relación entre su Dim Customer [Customer key] y tu FactInternetSales [Customer key] en la vista del modelo. Si luego agrega una tabla visual usando Dim Customer [Customerkey] y el FactInternetVentas[CustomerName] obtendrás el mismo resultado (y así es como deberías hacerlo realmente). Entonces no se necesita ninguna medida.

marc_hll

En respuesta a pablodbrown

@PaulDBBrown

Gracias por la respuesta, intenté crear su medida en la tabla DimCustomer pero no pude replicar la misma que la suya. En cambio, me pongo todo Peter. ¿Tenía una relación CustomerKey conectada en la parte posterior?

marc_hll_0-1601920133493.png

pablodbrown

En respuesta a marc_hll

@marc_hll

ok, entonces ahora entiendo lo que estás tratando de hacer. No busca una medida, sino una columna calculada.

¿Hay alguna razón por la que necesite que estas tablas no estén relacionadas?

De lo contrario, crearía una nueva tabla de dimensiones (en lugar de Dim Customer) haciendo referencia a la tabla FactInternetSales en Power Query (seleccione su tabla FactInternetSales haciendo clic derecho en la consulta de la tabla y seleccione «referencia»), elimine todas las columnas excepto CustomerID y CustomerName, seleccione CustomerID y elimine los duplicados, y cárguelos en su modelo. Cree una relación entre la nueva tabla de dimensiones y su tabla de hechos uniendo los campos para CustomerId en una relación de uno a varios y listo (incluso puede ocultar el campo CustomerName en su tabla FactInternetSales).

No necesita una columna calculada si sigue este método (que también es en realidad una «mejor práctica»).

Si realmente necesita que las tablas no estén relacionadas, ¿puede explicar el contexto? ¿Qué estás tratando de lograr y por qué?

Gracias.

Deja un comentario

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