Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Grow your Fabric skills and prepare for the DP-600 certification exam by completing the latest Microsoft Fabric challenge.

Reply
Syndicate_Admin
Administrator
Administrator

Resultados incorrectos en el gráfico pero resultados correctos en la tabla virtual

¡Hola a todos!

I'm se enfrentan a un problema un poco difícil de explicar, así que vamos a ver si puedo lograr para establecerme lo suficientemente claro para obtener un poco de ayuda / asistencia aquí.
Se proporciona una muestra de mi modelo de datos actual en la siguiente imagen.

Capture.PNG

Mi problema es el siguiente:
Construí una tabla virtual para calcular pacientes activos (dada una definición complejaactiva del paciente) con la ayuda de DAX Studio, y esa tabla virtual está retrayendo los resultados correctos en cada nivel de granularidad (ya comprobado usando DAX Studio aswell).
Sin embargo, y para mi disgusto en este momento ya que he intentado todo lo que sé para solucionar esto, incluido el uso de linaje de datos con TREATAS, cuando uso una medida que utiliza esa tabla virtual para mostrar datos en el gráfico de líneas (gráfico tiene evolución por fecha procedente de dimDates, y por tipo de precritor procedente de dimPrescriberType), los valores no son correctos en todos los niveles de granularidad.

La métrica que estoy usando es la siguiente:

Actual Patients = 

/*
The set of rules for the Actual Patient count, in month X, is the number of patients that:
    1) ordered 1 or more packs in month X or the preceeding 4 months 
    plus
    2) the patients who ordered >1 pack before the X preceeding months and covered minimum 1 of the X preceeding months, 
        assuming 45 days coverage by 1 pack and only taking into account the last order
*/

--calculates Min and Max Order date, in order to filter  further ahead
VAR MinOrderDate = MIN( facOrders[Date_receipt] )
VAR MaxOrderDate = MAX( facOrders[Date_receipt] )

--selected month stop (to simulate what the user would select iin PBI slicer)
VAR SelParameter = SELECTEDVALUE( parStopMonths[Stop Months] )

--selected date period
VAR SelDate = SELECTEDVALUE( dimDates[Date] )
--calculates the GroupbyTable only with time periods and Prescriber ID's
VAR GroupbyTable = 
		CROSSJOIN(
					SUMMARIZE(
						FILTER( dimDates, dimDates[Day] = 1 && dimDates[Date] >= MinOrderDate && dimDates[Date] <= MaxOrderDate ),
						[Date],
						[YearMonth]
						),
					VALUES( dimPatients[PatientID] )
				)

--calculates when a patient is Actual or not
VAR ActPts = 
		FILTER(
			ADDCOLUMNS(
			GroupbyTable,
			"ActPt", 	
					VAR MinDate 	= CALCULATE( MIN( dimDates[Date] ) )
					VAR StartDate 	= EOMONTH( MinDate, - SelParameter - 1)
					VAR SelPatient 	= [PatientID]
					VAR OrderQtyPeriod = CALCULATE( COUNTROWS( facOrders ) , dimDates[Date] > StartDate && dimDates[Date] <= MinDate, facOrders[PatientID] = SelPatient )
					
					VAR PacksQtyBeforeStartDate = CALCULATE( SUM( facOrders[Packs] ), dimDates[Date] <= StartDate , facOrders[PatientID] = SelPatient )
					
					VAR MaxOrderDateBeforeStart = CALCULATE( MAX( facOrders[Date_receipt] ), dimDates[Date] <= StartDate, facOrders[PatientID] = SelPatient )
					
					VAR PacksQtyMOBS = CALCULATE( SUM( facOrders[Packs] ), dimDates[Date] = MaxOrderDateBeforeStart, facOrders[PatientID] = SelPatient )
					
					VAR MaxCoverageDate = EDATE( MaxOrderDateBeforeStart, ROUNDDOWN( PacksQtyMOBS * 45 / 30, 0) )
					
					RETURN
						SWITCH(
								TRUE(),
								OrderQtyPeriod > 0, 1,
								PacksQtyBeforeStartDate > 1 && MaxCoverageDate >= MinDate, 1,
								BLANK()
							)
			),
			[ActPt] = 1 
		)

--returns prescriber type
VAR PrescType = 
		ADDCOLUMNS(
							SELECTCOLUMNS(
                                        ActPts,
                                        "Date", [Date],
                                        "PatientID", [PatientID]
                                        ),
							"PrescriberID",
											VAR MinDate 	= CALCULATE( MIN( dimDates[Date] ) )
											VAR MaxOrderDateBeforeSelPeriod = CALCULATE( MAX( facOrders[Date_receipt] ), dimDates[Date] <= MinDate  )
											VAR SelPatient 	= [PatientID]
											
											RETURN
											CALCULATE( MIN( facOrders[PrescriberID] ), dimPatients[PatientID] = SelPatient, dimDates[Date] = MaxOrderDateBeforeSelPeriod ),
							"PrescriberType",
											VAR MinDate 	= CALCULATE( MIN( dimDates[Date] ) )
											VAR MaxOrderDateBeforeSelPeriod = CALCULATE( MAX( facOrders[Date_receipt] ), dimDates[Date] <= MinDate  )
											VAR SelPatient 	= [PatientID]
											
											RETURN
											CALCULATE( MIN( facOrders[PrescriberType] ), dimPatients[PatientID] = SelPatient, dimDates[Date] = MaxOrderDateBeforeSelPeriod ),
							"BrickID",
											VAR MinDate 	= CALCULATE( MIN( dimDates[Date] ) )
											VAR MaxOrderDateBeforeSelPeriod = CALCULATE( MAX( facOrders[Date_receipt] ), dimDates[Date] <= MinDate  )
											VAR SelPatient 	= [PatientID]
											
											RETURN
											CALCULATE( MIN( facOrders[BrickCode] ), dimPatients[PatientID] = SelPatient, dimDates[Date] = MaxOrderDateBeforeSelPeriod )	
						)

--dealing with data lineage
VAR ActPatPresc_Lin = 
			TREATAS(
					PrescType
					,dimDates[Date]
					,dimPatients[PatientID]
					,dimPrescriber[PrescriberID]
					,dimPrescriberType[PrescriberType]
					,dimGeography[BrickCode]
			)
		

RETURN

SWITCH( 
    TRUE(),
    SelDate <> BLANK(),
        CALCULATE( DISTINCTCOUNT( dimPatients[PatientID] ), ActPatPresc_Lin),
    CALCULATE( DISTINCTCOUNT( dimPatients[PatientID] ), ActPatPresc_Lin, dimDates[Date] = MaxOrderDate ) 
)



En este punto no puedo compartir ya que es muy sensible.
¿Puede sugeer cualquier recurso para ir a por, con el fin de tratar de solucionar este problema, por favor?
Ya leí el blog de linaje de datos,de Alberto y Marco, pero no me ayudó mucho además de enseñarme qué linaje de datos es (que pensé que era la fuente de este problema).
Gracias de antemano

5 REPLIES 5
Syndicate_Admin
Administrator
Administrator

Hola, @SergioTorrinha

En la fórmula DAX, definió varias tablas y valores. Cuando encontré problemas en una fórmula DAX complicada, normalmente divido DAX en varias partes para realizar pruebas paso a paso. Para probar las tablas que definí, normalmente copiaba el DAX que definí para crear una nueva tabla y comprobar el resultado para asegurarme de que la tabla es lo que realmente necesito. Para probar las variables que definí, las devuelvo en el DAX y las pongo en el gráfico para probar si el valor es correcto.

Tal vez también puede dividir la fórmula DAX en varias partes para hacer algunas pruebas. (Si desea utilizar un gráfico de columnas, puede colocar cada parte en él y comprobar el valor). O simplemente puede utilizar más de una medida para lograr esto, que no tendrá un gran impacto en la eficiencia

Cómo depurar una medida DAX

Saludos

Equipo de apoyo a la comunidad _Robert Qin

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

Syndicate_Admin
Administrator
Administrator

Hola, @SergioTorrinha

¿Qué quieres decir con "se marcó como spam por alguna razón"? ¿Ha encontrado una solución a este problema?

Es muy difícil encontrar la verdadera razón de este problema solo con la fórmula DAX y la vista de relación.

Puede intentar cambiar las direcciones del filtro entre las tablas del modelo de datos a "Ambos" y comprobar si el valor puede llegar a ser verdadero.

Saludos

Equipo de apoyo a la comunidad _Robert Qin

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

Hola @v-robertq-msft

Gracias por sus comentarios y por tomarse el tiempo para mirar mi código DAX.


Lo que usted se refiere en su respuesta, es algo que he hecho, antes de venir aquí a los foros para pedir ayuda, y es por eso que ya me refiero en mi primer post (aunque tal vez no estaba lo suficientemente claro).

Como se puede ver, en mi código, he definido sólo tablas esenciales para mi caso de uso (si lo encuentra relevante puedo explicar breifly cuál era la lógica detrás de la construcción de tablas virtuales, sólo hágamelo saber) y también he materializado la tabla virtual final (ActPatPresc_Lin) en una tabla DAX. Después de esto, me aseguré de que en PBI los resultados retreived por esta tabla eran los correctos - Construí algunos gráficos simples y usé segmentaciones de datos de columnas de tablas dimensionales conectadas a facOrders, y también usé algunas otras columnas (de tablas dimensionales conectadas a facOrders) en gráficos para crear el contexto de filtro correcto. Por lo tanto, estoy bastante seguro de que los resultados provenientes de las tablas virtuales son absolutamente correctos.
Con esto en mente, probablemente, el problema es que la última parte de mi código está debajo de la instrucción RETURN. ¿Crees lo mismo? ¿Tienes alguna sugestion de mejora para este?


En este punto usted podría estar preguntándose por qué no estoy utilizando la tabla DAX matearilized para resolver el problema.
No quiero hacer esto, por 2 razones principales:


1 - la solución que me gustaría crear, es "generar" y nueva tabla virtual ActPatPresc_Lin, cada vez que un usuario de informe utiliza una segmentación de datos específica en el panel que básicamente devolverá un valor diferente para esta parte de mi código:

--selected month stop (para simular lo que el usuario seleccionaría iin PBI slicer)
VAR SelParameter - SELECTEDVALUE( parStopMonths[Stop Months] )


2 - Las tablas DAX pueden plantear problemas de rendimiento, algo que me gustaría evitar para garantizar una buena expiración del usuario al final.
Específicamente en este cenario, debo utilizar una unión cruzada entre las fechas en las que hubo órdenes y los pacientes id;s, con el fin de asegurar que incluso en un mes donde un paciente no hace ningún pedido todavía puede ser contado como paciente real si respeta las condiciones anteriormente mencionadas. Me temo que este cruce podría "soplar en mi cara" en el futuro con el crecimiento de los documentos de identidad y las fechas.

Una vez más, gracias por usted intput y por tomarse el tiempo para investigar esto.

Hola @v-robertq-msft , gracias por llegar!

Responder a sus preguntas una por una:

¿Qué quieres decir con "se marcó como spam por alguna razón"?

Después de publicar este hilo, no pude verlo en el área respectiva de los foros. Así que publiqué (en algún lugar, aquí en los foros, que no recuerdo exactamente dónde), si algún moderador podría comprobar si el post estaba marcado como spam de una manera automatizada.
Aparentemente fue.con respecto a una de sus colegas.
Sin embargo, esto, para mí, no es muy importante, pero sin embargo es importante para Microsoft, porque algunos mensajes de los usuarios se están marcando automáticamente un spam sin, de hecho, ser un hilo de spam real.
Lo que es importante, para mí, es tener algo de ayuda sobre el tema para que pueda seguir demostrando que PBI es la mejor herramienta para el trabajo en cuestión (y otros...).

¿Ha encontrado una solución a este problema?
Desgraciadamente, no.necesito ayuda, si es posible. 🙂

Es muy difícil encontrar la verdadera razón de este problema solo con la fórmula DAX y la vista de relación.
Sé que es, de hecho, difícil encontrar la verdadera razón del problema incluso con los datos.
Sin embargo, si desea tener algo para probar, plese no dude en utilizar la base de datos Advancedworks (la tabla de hechos de pedidos debe ser la fuente de datos principal) y, con la imagen es posible dibujar el cenario (lo siento, pero no lo tengo instalado en mi sistema).

Puede intentar cambiar las direcciones del filtro entre las tablas del modelo de datos a "Ambos" y comprobar si el valor puede llegar a ser verdadero.
Lo siento, pero no puedo ver cómo las direcciones de las relaciones en las tablas de mi modelo de datos ayudarán en este sentido, ya que estoy teniendo resultados correctos en mi tabla virtual y sólo tengo un problema, el momento en que paso los resultados en una medida que se mostrará en una gráfica de línea.
Además, todas mis dimensiones están filtrando mi tabla de hechos, exactamente siguiendo las relaciones se envía en un esquema inicial de las mejores prácticas.
¿Le importaría explicar un poco más sobre cómo ayudan las direcciones de las relaciones en esto?

Una vez más, gracias por su ayuda. 🙂

Syndicate_Admin
Administrator
Administrator

¿Se me permite golpear este post, ya que fue marcado como spam por alguna razón?
Gracias 🙂

Helpful resources

Announcements
Europe Fabric Conference

Europe’s largest Microsoft Fabric Community Conference

Join the community in Stockholm for expert Microsoft Fabric learning including a very exciting keynote from Arun Ulag, Corporate Vice President, Azure Data.

RTI Forums Carousel3

New forum boards available in Real-Time Intelligence.

Ask questions in Eventhouse and KQL, Eventstream, and Reflex.

Top Solution Authors
Top Kudoed Authors