Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.
Estimados usuarios del foro
¿Alguien ha encontrado cambios en el estado del producto de seguimiento de un período a otro?
Tengo la siguiente tabla:
identificación | fecha | estado |
1 | 2021-01 | A |
1 | 2021-02 | A |
1 | 2021-05 | B |
1 | 2021-06 | C |
1 | 2021-07 | A |
2 | 2021-01 | C |
2 | 2021-05 | C |
2 | 2021-06 | A |
2 | 2021-07 | A |
2 | 2021-08 | B |
3 | 2021-01 | C |
3 | 2021-03 | A |
3 | 2021-05 | A |
3 | 2021-06 | B |
3 | 2021-08 | C |
También tengo dos filtros que funcionan como datos al principio del período y datos al final del período (no entre ellos)
Por ejemplo: start_date filtro - 2021-01 y end_date 2021-05
Lo veo así:
El producto con id = 1 en 2021-01 tiene estado A y en 2021-05 tiene estado B y así sucesivamente.
Start_date | End_date | Identificación | Empezar | Fin |
2021-01 | 2021-05 | 1 | A | B |
2021-01 | 2021-05 | 2 | C | C |
2021-01 | 2021-05 | 3 | C | A |
Y como resultado, deseo tener una tabla como:
start_status | end_status | Contar |
A | A | 0 |
A | B | 1 |
A | C | 0 |
A | D | 0 |
B | A | 0 |
B | B | 0 |
B | C | 0 |
B | D | 0 |
C | A | 1 |
C | B | 0 |
C | C | 1 |
C | D | 0 |
D | A | 0 |
D | B | 0 |
D | C | 0 |
D | D | 0 |
Y por ejemplo para la fecha 2021-02 y 2021-07
Start_date | End_date | Identificación | Empezar | Fin |
2021-02 | 2021-07 | 1 | A | A |
2021-02 | 2021-07 | 2 | D | A |
2021-02 | 2021-07 | 3 | D | D |
Y tabla de resultados
start_status | end_status | Contar |
A | A | 1 |
A | B | 0 |
A | C | 0 |
A | D | 0 |
B | A | 0 |
B | B | 0 |
B | C | 0 |
B | D | 0 |
C | A | 0 |
C | B | 0 |
C | C | 0 |
C | D | 0 |
D | A | 1 |
D | B | 0 |
D | C | 0 |
D | D | 1 |
¿Tal vez alguien ya ha rastreado esto? ¡Estaré agradecido por ayuda!
Aquí está mi opinión sobre esto.
Primero creé una tabla para poder seleccionar el período de y hacia
PeriodFromTo =
VAR YearStart = int(left(min('status'[date]),4))
VAR YearFinish = int(left(max('status'[date]),4))
VAR Periods = SELECTCOLUMNS(GENERATESERIES(1,12),"Period",[Value])
VAR Years = SELECTCOLUMNS(GENERATESERIES(YearStart, YearFinish),"Year",[Value])
VAR Periods2 = CROSSJOIN(Years, Periods)
VAR Periods3 = SELECTCOLUMNS(Periods2,"PeriodFrom", [Year] & "-" & right("0" & [Period],2))
VAR Periods4 = SELECTCOLUMNS(Periods2,"PeriodTo", [Year] & "-" & right("0" & [Period],2))
VAR Periods5 = FILTER(CROSSJOIN(Periods3, Periods4), [PeriodFrom]<=[PeriodTo])
RETURN Periods5
Luego creé una tabla para unir el estado posible
StatusFromTo =
VAR Statuses = CALCULATETABLE(values('status'[status]))
VAR Statuses2 = SELECTCOLUMNS(Statuses,"statusFrom",'status'[status])
VAR Statuses3 = SELECTCOLUMNS(Statuses,"statusTo",'status'[status])
VAR Statuses4 = CROSSJOIN(Statuses2,Statuses3)
RETURN Statuses4
Y finalmente creó una medida para calcular los productos que cambiaron de un estado a otro.
statusCount =
VAR vPeriodFrom = CALCULATE( MIN(PeriodFromTo[PeriodFrom]), ALLSELECTED(PeriodFromTo[PeriodFrom]) )
VAR vPeriodTo = CALCULATE( max(PeriodFromTo[PeriodTo]), ALLSELECTED(PeriodFromTo[PeriodFrom]) )
VAR vStatusFrom = values(statusFromTo[statusFrom])
VAR vStatusTo = values(statusFromTo[statusTo])
VAR statuses = SUMMARIZE(FILTER('status','status'[date]<=vPeriodFrom),'status'[id],"date2",max('status'[date]))
VAR statuses2 = ADDCOLUMNS(FILTER(NATURALINNERJOIN('status',statuses),[date2]='status'[date]),"MINDATE",vPeriodFrom)
VAR statuses3 = SUMMARIZE(FILTER('status','status'[date]<=vPeriodTo),'status'[id],"date2",max('status'[date]))
VAR statuses4 = ADDCOLUMNS(FILTER(NATURALINNERJOIN('status',statuses3),[date2]='status'[date]),"MAXDATE",vPeriodTo)
VAR statuses5 = NATURALINNERJOIN(SELECTCOLUMNS(statuses2,"id",'status'[id],"status1",'status'[status]), SELECTCOLUMNS(statuses4,"id",'status'[id],"status2",'status'[status]))
RETURN COUNTROWS(FILTER(statuses5,[status1] in vStatusFrom && [status2] in vStatusTo))+0
pbix y archivo de datos en el siguiente enlace.
¡Hola, Daniel!
¡Muchas gracias por tan gran ayuda!
Traté de entender su solución, y continuaré ... pero hasta ahora sin éxito
Pero es posible cambiar la medida por fechas perdidas, considerar que el producto está en el estado "D", es decir, de 2021-02 a 2021-08
statusDe | statusTo | statusCount |
A | A | 0 |
A | B | 0 |
A | C | 0 |
A | D | 1 |
B | A | 0 |
B | B | 0 |
B | C | 0 |
B | D | 0 |
C | A | 0 |
C | B | 0 |
C | C | 0 |
C | D | 0 |
D | A | 0 |
D | B | 1 |
D | C | 1 |
D | D | 0 |
Gracias por su ayuda!!!
Hola, está considerando fechas perdidas.
No había ningún estado "D" en los datos de muestra, ¿puede actualizar su conjunto de datos de muestra y el resultado esperado?
el estado D no está en la tabla transaccional, este estado significa "faltante"
tabla de resultados, si se selecciona el período de 2021-02 y el período de 2021-08
statusDe | statusTo | statusCount |
A | A | 0 |
A | B | 0 |
A | C | 0 |
A | D | 1 |
B | A | 0 |
B | B | 0 |
B | C | 0 |
B | D | 0 |
C | A | 0 |
C | B | 0 |
C | C | 0 |
C | D | 0 |
D | A | 0 |
D | B | 1 |
D | C | 1 |
D | D | 0 |
¡Gracias de nuevo!
Ok, lo entiendo ahora.
Cambié el script de tabla de estado de unión cruzada a este para agregar el estado D
StatusFromTo =
VAR Statuses = CALCULATETABLE(values('status'[status]))
VAR Statuses2 = UNION(SELECTCOLUMNS(Statuses,"statusFrom",'status'[status]),ROW("status","D"))
VAR Statuses3 = UNION(SELECTCOLUMNS(Statuses,"statusTo",'status'[status]),ROW("status","D"))
VAR Statuses4 = CROSSJOIN(Statuses2,Statuses3)
RETURN Statuses4
Y la medida a esto
statusCount =
VAR vPeriodFrom = CALCULATE( MIN(PeriodFromTo[PeriodFrom]), ALLSELECTED(PeriodFromTo[PeriodFrom]) )
VAR vPeriodTo = CALCULATE( max(PeriodFromTo[PeriodTo]), ALLSELECTED(PeriodFromTo[PeriodFrom]) )
VAR vStatusFrom = values(statusFromTo[statusFrom])
VAR vStatusTo = values(statusFromTo[statusTo])
VAR statuses = FILTER('status','status'[date]=vPeriodFrom)
VAR statuses2 = FILTER('status','status'[date]=vPeriodTo)
VAR statuses3 = VALUES('status'[id])
VAR statuses4 = NATURALINNERJOIN(NATURALLEFTOUTERJOIN(SELECTCOLUMNS(DISTINCT('status'[id]),"id",'status'[id]),SELECTCOLUMNS(statuses,"id",'status'[id],"status1",'status'[status])), SELECTCOLUMNS(statuses2,"id",'status'[id],"status2",'status'[status]))
RETURN COUNTROWS(FILTER(statuses4,COALESCE([status1],"D") in vStatusFrom && COALESCE([status2],"D") in vStatusTo))+0
He actualizado el archivo pbix adjunto.
Por favor, hágamelo saber si eso funciona para usted.
Hiciste un trabajo increíble, espero que algún día alcances tu nivel!!!
¡Gracias!
Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City
Check out the April 2024 Power BI update to learn about new features.
User | Count |
---|---|
1 | |
1 | |
1 | |
1 | |
1 |