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

Shape the future of the Fabric Community! Your insights matter. That’s why we created a quick survey to learn about your experience finding answers to technical questions. Take survey.

Reply
Syndicate_Admin
Administrator
Administrator

Pase de primer intento (incorporando la continuación de la calificación incompleta)

Necesito ayudar a actualizar automáticamente la columna FirstAttemptPass en la tabla siguiente. Me temo que mi cerebro no se está envolviendo alrededor de la lógica necesaria para lograr esto. Si necesitamos crear columnas adicionales, está bien.

En este uso, una sola prueba se compone de coincidencia de tipos de prueba oral y práctica. Mientras que un Práctico puede no tener un Oral coincidente (ver Kay, Sue, y Ron, abajo), un Oral siempre conduce a un Práctico.

Las calificaciones son satisfactorias, insatisfactorias e incompletas.

El protocolo es:

  1. Si Oral es Satisfactorio y si Práctico es Satisfactorio, entonces FirstAttemptPass es Sí (o Verdadero).
  2. Si Oral es Incompleto, busque la siguiente aparición del mismo oral y vuelva al paso 1.
  3. Si Oral es Satisfactorio y Práctico es Incompleto, busque el siguiente Práctico y vuelva al paso 1.
  4. Si Oral es Insatisfactorio, entonces tanto él como el Práctico coincidente (independientemente del grado) es No (o Falso).
  5. Si Práctico es Insatisfactorio, entonces tanto él como el Oral coincidente (independientemente del grado) es No (o Falso).
  6. Si Practical no tiene coincidencia Oral, como en el caso de mi Curso 4, Etapa 4, Unidad 4 ejemplos a continuación, entonces un primer Satisfactorio es Sí, un Incompleto que conduce a un Satisfactorio es Sí, y un Insatisfactorio (ya sea como primera unidad o como una continuación de Incompleto) es un No.

Espero haber explicado todas las condiciones. Si no es así, no dude en pedir una aclaración. He vinculado un archivo .pbix que tiene los mismos datos que la tabla insertada a continuación.

Datos de ejemplo para FirstAttemptPass

Nombre del estudianteActivityStartcursoetapaunidadTipo de pruebagradoFirstAttemptPass
anecdotario01/02/21 8:00 SOYCurso 1Etapa 1Unidad 10oralS
anecdotario01/03/21 17:00Curso 1Etapa 1Unidad 10prácticoS
anecdotario01/04/21 17:00Curso 1Etapa 2Unidad 17oralI
anecdotario01/06/21 13:00Curso 1Etapa 2Unidad 17oralS
anecdotario01/07/21 8:00 SOYCurso 1Etapa 2Unidad 17prácticoS
Deb01/01/21 20:00Curso 2Etapa 1Unidad 12oralUNo
Deb01/02/21 19:00Curso 2Etapa 1Unidad 12oralSNo
Deb01/04/21 15:00Curso 2Etapa 1Unidad 12prácticoSNo
Deb01/05/21 22:00Curso 2Etapa 2Unidad 14oralS
Deb01/06/21 19:00Curso 2Etapa 2Unidad 14prácticoS
AM01/01/21 11:00 SOYCurso 3Etapa 1Unidad 7oralI
AM01/02/21 10:00 SOYCurso 3Etapa 1Unidad 7oralUNo
AM01/03/21 19:00Curso 3Etapa 1Unidad 7oralSNo
AM01/05/21 11:00 SOYCurso 3Etapa 1Unidad 7prácticoSNo
gato01/01/21 10:00 SOYCurso 1Etapa 1Unidad 10oralSNo
gato01/02/21 9:00 SOYCurso 1Etapa 1Unidad 10prácticoI
gato01/03/21 10:00 SOYCurso 1Etapa 1Unidad 10prácticoUNo
gato01/05/21 7:00 SOYCurso 2Etapa 1Unidad 9oralS
gato01/06/21 9:00 SOYCurso 2Etapa 1Unidad 9prácticoI
gato01/07/21 15:00Curso 2Etapa 1Unidad 9prácticoS
Kay01/12/21 8:30 SOYCurso 4Etapa 4Unidad 4prácticoS
su01/12/21 10:45 SOYCurso 4Etapa 4Unidad 4prácticoI
su01/13/21 10:00 SOYCurso 4Etapa 4Unidad 4prácticoS
Ron14/01/21 14:30Curso 4Etapa 4Unidad 4prácticoI
Ron15/01/21 15:00Curso 4Etapa 4Unidad 4prácticoUNo
2 ACCEPTED SOLUTIONS
Syndicate_Admin
Administrator
Administrator

@RicFischer

Creo que lo solucioné, por favor, compruébalo.

FirstAttemptPass Solved = 
VAR __o = "Oral"
VAR __p = "Practical"
VAR __grades =
    CALCULATETABLE (
        Table1,
        ALLEXCEPT (
            Table1,
            Table1[StudentName],
            Table1[Course],
            Table1[Stage],
            Table1[Unit]
        )
    )
VAR Result =
    SWITCH (
        TRUE (),
        CONTAINS ( __grades, Table1[Test Type], __o, Table1[Grade], "U" )
            || CONTAINS ( __grades, Table1[Test Type], __p, Table1[Grade], "U" ), "NO",
        CONTAINS ( __grades, Table1[Test Type], __o, Table1[Grade], "S" )
            && CONTAINS ( __grades, Table1[Test Type], __p, Table1[Grade], "S" ), "YES",
        NOT CONTAINS ( __grades, Table1[Test Type], __o )
            && CONTAINS ( __grades, Table1[Test Type], __p, Table1[Grade], "S" ), "YES"
    )
RETURN
    IF ( Table1[Grade] = "I", BLANK (), IF ( Table1[Grade] = "U", "NO", Result ) )

Fowmy_0-1622987432504.png

View solution in original post

@RicFischer

Esto podría funcionar:

FirstAttemptPass Solved = 
VAR __o = "Oral"
VAR __p = "Practical"
VAR __grades =
    CALCULATETABLE (
        FirstAttemptPass,
        ALLEXCEPT (
            FirstAttemptPass,
            FirstAttemptPass[StudentName],
            FirstAttemptPass[Course],
            FirstAttemptPass[Stage]
            // FirstAttemptPass[Unit]
        ),
        FirstAttemptPass[CancelReason] = BLANK()
    )
VAR Result =
    SWITCH (
        TRUE (),
        CONTAINS ( __grades, FirstAttemptPass[Test Type], __o, FirstAttemptPass[Grade], "U" )
            || CONTAINS ( __grades, FirstAttemptPass[Test Type], __p, FirstAttemptPass[Grade], "U" ), "NO",
        CONTAINS ( __grades, FirstAttemptPass[Test Type], __o, FirstAttemptPass[Grade], "S" )
            && CONTAINS ( __grades, FirstAttemptPass[Test Type], __p, FirstAttemptPass[Grade], "S" ), "YES",
        NOT CONTAINS ( __grades, FirstAttemptPass[Test Type], __o )
            && CONTAINS ( __grades, FirstAttemptPass[Test Type], __p, FirstAttemptPass[Grade], "S" ), "YES"
    )
RETURN
    SWITCH( 
        TRUE(),
        FirstAttemptPass[Grade]= "I", BLANK(),
        FirstAttemptPass[CancelReason] <> BLANK(), BLANK(),
        FirstAttemptPass[Grade] = "U", "NO", 
        Result 
    ) 

View solution in original post

11 REPLIES 11
Syndicate_Admin
Administrator
Administrator

Cuando conecté la respuesta a mi Power BI, me di cuenta de que había olvidado que a mis datos de ejemplo les faltaban algunos campos cruciales (porque, en mis datos reales, los nombres de las unidades no siempre coinciden entre Oral y Práctico). Por lo tanto, estoy pidiendo por segunda vez con la esperanza de que todos ustedes sean lo suficientemente amables como para ayudarme con esto (de nuevo).

Olvidé mencionar en mi primer post que necesitaba una columna, no una medida.

Las calificaciones son satisfactorias, insatisfactorias e incompletas.

El protocolo aclarado es:

  1. Si primero Oral es Satisfactorio y si primero Práctico es Satisfactorio, entonces FirstAttemptPass es Sí (o Verdadero).
  2. Si Oral es Incompleto, busque la siguiente aparición del mismo oral y vuelva al paso 1.
  3. Si Oral es Satisfactorio y Práctico es Incompleto, busque el siguiente Práctico y vuelva al paso 1.
  4. Si Oral es Insatisfactorio, entonces tanto él como el Práctico coincidente (independientemente de la fecha o grado) es No (o Falso).
  5. Si Práctico es Insatisfactorio, entonces tanto él como el Oral coincidente (independientemente de la fecha o grado) es No (o Falso).
  6. Si el primer Práctico no tiene coincidencia Oral, como en el caso de mi Curso 4, Etapa 4, Unidad 4 ejemplos a continuación, entonces un primer Satisfactorio es Sí, un Incompleto que conduce a un Satisfactorio es Sí, y un Insatisfactorio (ya sea como primera unidad o como una continuación de Incompleto) es un No.

El nuevo elemento crítico es el campo MatchingCourseStageUnit. Debido a que los nombres de las unidades no siempre se alinean (un ejemplo: la unidad 9a podría ser oral y la unidad 9b podría ser práctica) en los cursos más antiguos, ahora retirados, tuve que idear un campo coincidente separado para la cordura de búsqueda.

Datos de ejemplo (mismo vínculo que antes, pero el archivo se actualiza)

Estos son mis nuevos datos de ejemplo:

Nombre del estudianteActivityStartcursoetapaunidadCourseStageUnitOppositeCourseStageUnitMatchingCourseStageUnitTipo de pruebagradoManualFirstAttemptPass
anecdotario01/02/21 8:00 SOYCurso 1Etapa 1Unidad 10 OralCurso 1Estage 1Unidad 10 OralCurso 1Estage 1Unit 10 PrácticoCurso 1Estage 1Unit 10 PrácticooralS
gato01/01/21 10:00 SOYCurso 1Etapa 1Unidad 10 OralCurso 1Estage 1Unidad 10 OralCurso 1Estage 1Unit 10 PrácticoCurso 1Estage 1Unit 10 PrácticooralSNo
anecdotario01/03/21 17:00Curso 1Etapa 1Unidad 10 PrácticaCurso 1Estage 1Unit 10 PrácticoCurso 1Estage 1Unidad 10 OralCurso 1Estage 1Unidad 10 OralprácticoS
gato01/02/21 9:00 SOYCurso 1Etapa 1Unidad 10 PrácticaCurso 1Estage 1Unit 10 PrácticoCurso 1Estage 1Unidad 10 OralCurso 1Estage 1Unidad 10 OralprácticoI
gato01/03/21 10:00 SOYCurso 1Etapa 1Unidad 10 PrácticaCurso 1Estage 1Unit 10 PrácticoCurso 1Estage 1Unidad 10 OralCurso 1Estage 1Unidad 10 OralprácticoUNo
anecdotario01/04/21 17:00Curso 1Etapa 2Unidad 17 OralCurso 1Estage 2Unidad 17 OralCurso 1Estage 2Unit 17 PrácticoCurso 1Estage 2Unit 17 PrácticooralI
anecdotario01/06/21 13:00Curso 1Etapa 2Unidad 17 OralCurso 1Estage 2Unidad 17 OralCurso 1Estage 2Unit 17 PrácticoCurso 1Estage 2Unit 17 PrácticooralS
anecdotario01/07/21 8:00 SOYCurso 1Etapa 2Unidad 17 PrácticaCurso 1Estage 2Unit 17 PrácticoCurso 1Estage 2Unidad 17 OralCurso 1Estage 2Unidad 17 OralprácticoS
Deb01/01/21 20:00Curso 2Etapa 1Unidad 12 OralCurso 2Etapa 1Unidad 12 OralCurso 2Estage 1Unit 12 PrácticoCurso 2Estage 1Unit 12 PrácticooralUNo
Deb01/02/21 19:00Curso 2Etapa 1Unidad 12 OralCurso 2Etapa 1Unidad 12 OralCurso 2Estage 1Unit 12 PrácticoCurso 2Estage 1Unit 12 PrácticooralSNo
Deb01/04/21 15:00Curso 2Etapa 1Unidad 12 PrácticaCurso 2Estage 1Unit 12 PrácticoCurso 2Etapa 1Unidad 12 OralCurso 2Etapa 1Unidad 12 OralprácticoSNo
gato01/05/21 7:00 SOYCurso 2Etapa 1Unidad 9 OralCurso 2Estage 1Unidad 9 OralCurso 2Estage 1Unit 9 PrácticoCurso 2Estage 1Unit 9 PrácticooralS
gato01/06/21 9:00 SOYCurso 2Etapa 1Unidad 9 PrácticaCurso 2Estage 1Unit 9 PrácticoCurso 2Estage 1Unidad 9 OralCurso 2Estage 1Unidad 9 OralprácticoI
gato01/07/21 15:00Curso 2Etapa 1Unidad 9 PrácticaCurso 2Estage 1Unit 9 PrácticoCurso 2Estage 1Unidad 9 OralCurso 2Estage 1Unidad 9 OralprácticoS
Deb01/05/21 22:00Curso 2Etapa 2Unidad 14 OralCurso 2Estage 2Unit 14 OralCurso 2Estage 2Unit 14 PrácticoCurso 2Estage 2Unit 14 PrácticooralS
Deb01/06/21 19:00Curso 2Etapa 2Unidad 14 PrácticaCurso 2Estage 2Unit 14 PrácticoCurso 2Estage 2Unit 14 OralCurso 2Estage 2Unit 14 OralprácticoS
AM01/01/21 11:00 SOYCurso 3Etapa 1Unidad 7 OralCurso 3Estage 1Unidad 7 OralCurso 3Estage 1Unit 7 PrácticoCurso 3Estage 1Unit 7 PrácticooralI
AM01/02/21 10:00 SOYCurso 3Etapa 1Unidad 7 OralCurso 3Estage 1Unidad 7 OralCurso 3Estage 1Unit 7 PrácticoCurso 3Estage 1Unit 7 PrácticooralUNo
AM01/03/21 19:00Curso 3Etapa 1Unidad 7 OralCurso 3Estage 1Unidad 7 OralCurso 3Estage 1Unit 7 PrácticoCurso 3Estage 1Unit 7 PrácticooralSNo
AM01/05/21 11:00 SOYCurso 3Etapa 1Unidad 7 PrácticaCurso 3Estage 1Unit 7 PrácticoCurso 3Estage 1Unidad 7 OralCurso 3Estage 1Unidad 7 OralprácticoSNo
Kay01/12/21 8:30 SOYCurso 4Etapa 4Unidad 4 PrácticaCurso 4Stage 4Unit 4 PrácticoCurso 4Stage 4Unit 4 Oral prácticoS
su01/12/21 10:45 SOYCurso 4Etapa 4Unidad 4 PrácticaCurso 4Stage 4Unit 4 PrácticoCurso 4Stage 4Unit 4 Oral prácticoI
su01/13/21 10:00 SOYCurso 4Etapa 4Unidad 4 PrácticaCurso 4Stage 4Unit 4 PrácticoCurso 4Stage 4Unit 4 Oral prácticoS
Ron14/01/21 14:30Curso 4Etapa 4Unidad 4 PrácticaCurso 4Stage 4Unit 4 PrácticoCurso 4Stage 4Unit 4 Oral prácticoI
Ron15/01/21 15:00Curso 4Etapa 4Unidad 4 PrácticaCurso 4Stage 4Unit 4 PrácticoCurso 4Stage 4Unit 4 Oral prácticoUNo

Si alguien puede ayudar con esto, realmente lo agradecería.

Para ser más específico, necesito modificar @Fowmysolución donde se ve un campo MatchingCourseStageUnit para encontrar el curso coincidente (oral a práctico o práctico a oral) con el fin de determinar si todo el evento fue un pase por primera vez o no. por ejemplo:

En el primer registro, tenemos el primer Oral de Ana con un valor CourseStageUnit de"Course 1Stage 1Unit 10 Oral". Vemos que lo pasó (Grade="S"), por lo que necesitamos usar el campo MatchingCourseStageUnit con un valor de "Course 1Stage 1Unit 10 Practical" para buscar la unidad coincidente. La unidad coincidente sería con el mismo nombre de estudiante (Ana) y un valor de CourseStageUnit de "Course 1Stage 1Unit 10 Practical". Si eso es un Grade="S" (y es en este caso), entonces es un Sí en el cálculo FirstAttemptPass.

Si es un fracaso para cualquiera de las unidades (Grado = "U"), entonces ambas unidades necesitan un "No" y todos los demás intentos de la Oral y Práctica para el mismo estudiante, curso y etapa deben ser un "No" también, porque no lo pasaron en el primer intento.

@RicFischer

Puede probar la solución que ya proporcioné pero quitar el filtro en el [Unidad] dentro de ALLEXCEPT.
¿como sigue?

FirstAttemptPass Solved = 
VAR __o = "Oral"
VAR __p = "Practical"
VAR __grades =
    CALCULATETABLE (
        Sheet1,
        ALLEXCEPT (
            Sheet1,
            Sheet1[StudentName],
            Sheet1[Course],
            Sheet1[Stage]
            // Sheet1[Unit]
        )
    )
VAR Result =
    SWITCH (
        TRUE (),
        CONTAINS ( __grades, Sheet1[Test Type], __o, Sheet1[Grade], "U" )
            || CONTAINS ( __grades, Sheet1[Test Type], __p, Sheet1[Grade], "U" ), "NO",
        CONTAINS ( __grades, Sheet1[Test Type], __o, Sheet1[Grade], "S" )
            && CONTAINS ( __grades, Sheet1[Test Type], __p, Sheet1[Grade], "S" ), "YES",
        NOT CONTAINS ( __grades, Sheet1[Test Type], __o )
            && CONTAINS ( __grades, Sheet1[Test Type], __p, Sheet1[Grade], "S" ), "YES"
    )
RETURN
    IF ( Sheet1[Grade] = "I", BLANK (), IF ( Sheet1[Grade] = "U", "NO", Result ) )

Estoy recibiendo algunos ahora que son FirstAttemptPass resuelto con sí a pesar de que no tiene ninguna calificación en absoluto. Ninguna calificación es "(En blanco)" en la lista desplegable para ese campo:

image.png

Esto sucede cuando se cancela el evento, algo en lo que no pensé al plantear la pregunta. Deben ser completamente ignorados en esta fórmula. No afectan al estado de un intento posterior que se considera como un primer intento.

@RicFischer

Por favor, comparta los datos de la muestra con las calificaciones en blanco y los resultados esperados.



Archivo actualizado en el enlace original: https://drive.google.com/file/d/1OfIkdM5DbmERBG7CDbZFSsFDYA71aszY/view?usp=sharing

Notas:

  1. Esto agrega Joe. Joe tuvo dos cancelaciones, una por su oral debido a un error de programación y otra por su práctica debido al clima. No se dan calificaciones para cancelaciones. Hay una columna CancelReason y cualquier texto en esa columna significa que el evento no se produjo.
  2. Otro elemento notable de Joe es que está inscrito en un curso donde los nombres de las unidades son únicos. Por ejemplo, su oral es la Unidad 4a Oral y su práctica es la Unidad 4b Práctica. Estoy usando una tabla de búsqueda en otro lugar para rellenar automáticamente un MatchingCourseStageUnit en mi tabla principal para que pueda ver la otra parte de la prueba.
  3. Los demás requisitos siguen siendo los mismos. Tengo que encontrar la primera vez que un estudiante pasa un combinado (coincidencia) oral y práctico que han tomado. Si fallan el primero de los orales o prácticos para ese curso, etapa y emparejamiento de unidades, entonces han fallado todo el asunto y no obtuvieron un pase por primera vez.

Gracias, de nuevo, por su ayuda. He estado estudiando y aprendiendo de lo que ya has proporcionado para que pueda hacer esto por mi cuenta en el futuro.

@RicFischer

Esto podría funcionar:

FirstAttemptPass Solved = 
VAR __o = "Oral"
VAR __p = "Practical"
VAR __grades =
    CALCULATETABLE (
        FirstAttemptPass,
        ALLEXCEPT (
            FirstAttemptPass,
            FirstAttemptPass[StudentName],
            FirstAttemptPass[Course],
            FirstAttemptPass[Stage]
            // FirstAttemptPass[Unit]
        ),
        FirstAttemptPass[CancelReason] = BLANK()
    )
VAR Result =
    SWITCH (
        TRUE (),
        CONTAINS ( __grades, FirstAttemptPass[Test Type], __o, FirstAttemptPass[Grade], "U" )
            || CONTAINS ( __grades, FirstAttemptPass[Test Type], __p, FirstAttemptPass[Grade], "U" ), "NO",
        CONTAINS ( __grades, FirstAttemptPass[Test Type], __o, FirstAttemptPass[Grade], "S" )
            && CONTAINS ( __grades, FirstAttemptPass[Test Type], __p, FirstAttemptPass[Grade], "S" ), "YES",
        NOT CONTAINS ( __grades, FirstAttemptPass[Test Type], __o )
            && CONTAINS ( __grades, FirstAttemptPass[Test Type], __p, FirstAttemptPass[Grade], "S" ), "YES"
    )
RETURN
    SWITCH( 
        TRUE(),
        FirstAttemptPass[Grade]= "I", BLANK(),
        FirstAttemptPass[CancelReason] <> BLANK(), BLANK(),
        FirstAttemptPass[Grade] = "U", "NO", 
        Result 
    ) 

Gracias, @Fowmy. Creo que esta solución funcionará.

También aprendí mucho de la fórmula. Se lo agradezco.

Syndicate_Admin
Administrator
Administrator

No @RicFischer ,

¿Necesita una medida o una columna?

Aquí hay una medida:

#_FirstAttemptPass =
VAR currentGrade = MAX ( Table1[Grade] )
VAR _t =
    CALCULATETABLE (
        VALUES ( Table1[Grade] ),
        ALLEXCEPT (
            Table1,
            Table1[StudentName],
            Table1[Course],
            Table1[Stage],
            Table1[Unit]
        )
    )
VAR result =
    IF (
        HASONEVALUE ( Table1[Grade] ),
        SWITCH (
            TRUE (),
            currentGrade = "I", "",
            currentGrade = "U", "No",
            currentGrade = "S" && "U" IN _t, "No",
            "Yes"
        )
    )
RETURN
    result

ERD_0-1622990810446.png

Si esta publicación ayuda, entonces por favor considere Aceptarlo como la solución ✔️para ayudar a los otros miembros a encontrarlo más rápidamente.

Syndicate_Admin
Administrator
Administrator

@RicFischer

Creo que lo solucioné, por favor, compruébalo.

FirstAttemptPass Solved = 
VAR __o = "Oral"
VAR __p = "Practical"
VAR __grades =
    CALCULATETABLE (
        Table1,
        ALLEXCEPT (
            Table1,
            Table1[StudentName],
            Table1[Course],
            Table1[Stage],
            Table1[Unit]
        )
    )
VAR Result =
    SWITCH (
        TRUE (),
        CONTAINS ( __grades, Table1[Test Type], __o, Table1[Grade], "U" )
            || CONTAINS ( __grades, Table1[Test Type], __p, Table1[Grade], "U" ), "NO",
        CONTAINS ( __grades, Table1[Test Type], __o, Table1[Grade], "S" )
            && CONTAINS ( __grades, Table1[Test Type], __p, Table1[Grade], "S" ), "YES",
        NOT CONTAINS ( __grades, Table1[Test Type], __o )
            && CONTAINS ( __grades, Table1[Test Type], __p, Table1[Grade], "S" ), "YES"
    )
RETURN
    IF ( Table1[Grade] = "I", BLANK (), IF ( Table1[Grade] = "U", "NO", Result ) )

Fowmy_0-1622987432504.png

Olvidé especificar que necesitaba una columna. Considero correcta @Fowmyrespuesta y la marcaré como una solución. Pero, debido a que los datos son más complicados de lo que estaba recordando, olvidé un par de campos. Desde entonces recibí una solución aceptable, empezaré un hilo nuevo y hacer mi pregunta aclarada escribiré una respuesta a este hilo porque mi hilo nuevo estuvo marcado como spam.

Helpful resources

Announcements
November Carousel

Fabric Community Update - November 2024

Find out what's new and trending in the Fabric Community.

Dec Fabric Community Survey

We want your feedback!

Your insights matter. That’s why we created a quick survey to learn about your experience finding answers to technical questions.

Nov PBI Update Carousel

Power BI Monthly Update - November 2024

Check out the November 2024 Power BI update to learn about new features.

Live Sessions with Fabric DB

Be one of the first to start using Fabric Databases

Starting December 3, join live sessions with database experts and the Fabric product team to learn just how easy it is to get started.

Top Solution Authors
Top Kudoed Authors