Home » Evaluate Student Subject Status

Evaluate Student Subject Status

Document Pass or Fail against all students. A student is Pass if he is Pass = “Y” – Either in Maths or Science if Taken and – In Philosophy if taken and – In English if taken

📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 697
Challenge Difficulty: ⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Evaluate Student Subject Status with Power Query

Power Query solution 1 for Evaluate Student Subject Status, proposed by Kris Jaganah:
let
  A = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  B = Table.Group(
    A, 
    "Student", 
    {
      "Result", 
      each [
        a = Table.AddColumn(
          _, 
          "Abb", 
          each 
            if [Subject] = "Maths" or [Subject] = "Science" then
              "M"
            else
              Text.Start([Subject], 1)
        ), 
        b = 
          if List.Count(
            List.Select(
              Table.Group(a, "Abb", {"All", each List.Select([Pass], (v) => v = "Y"){0}? ?? "N"})[
                All
              ], 
              (w) => w = "N"
            )
          )
            > 0
          then
            "Fail"
          else
            "Pass"
      ][b]
    }
  ), 
  C = Table.Sort(B, "Student")
in
  C
Power Query solution 2 for Evaluate Student Subject Status, proposed by Seokho MOON:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Res = Table.Sort(Table.Group(Source, "Student", {"Result", Fun}), "Student"), 
  Fun = each [
    A = Table.SelectRows(_, (x) => x[Pass] = "N")[Subject], 
    B = List.ContainsAny(A, {"Philosophy", "English"}) or List.ContainsAll(A, {"Science", "Math"}), 
    C = if B then "Fail" else "Pass"
  ][C]
in
  Res
Power Query solution 3 for Evaluate Student Subject Status, proposed by Antriksh Sharma:
let
  Source = Table, 
  Replace = (T, L) =>
    let
      a = Table.SelectRows(T, each List.Contains(L, [Subject])), 
      b = List.ReplaceMatchingItems(a[Pass], {{"Y", 1}, {"N", 0}}), 
      c = List.Max(b)
    in
      c ?? 1, 
  Group = Table.Group(
    Source, 
    "Student", 
    {
      "Result", 
      each {"Fail", "Pass"}{
        Replace(_, {"Maths", "Science"}) * Replace(_, {"Philosophy"}) * Replace(_, {"English"})
      }, 
      type text
    }
  ), 
  Sort = Table.Sort(Group, {"Student", Order.Ascending})
in
  Sort
Power Query solution 4 for Evaluate Student Subject Status, proposed by Peter Krkos:
let a = Table.SelectRows(_, (x)=> List.Contains({"Maths", "Science"}, x[Subject]))[Pass]
 in {"Fail", "Pass"}{Byte.From((if List.IsEmpty(a) then true else List.Contains(a, "Y")) and not List.Contains(Table.SelectRows(_, (x)=> List.Contains({"Philosophy", "English"}, x[Subject]))[Pass], "N"))},
 type text}}), "Student")


                    
                  
          
Power Query solution 5 for Evaluate Student Subject Status, proposed by Alexandre Garcia:
let
  H = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  P = {"Maths", "Science"}, 
  L = Table.ReplaceValue(H, "N", "Result", Replacer.ReplaceText, {"Pass"}), 
  C = Table.Pivot(
    L, 
    {"Result"}, 
    "Pass", 
    "Subject", 
    each {"Pass", "Fail"}{
      Byte.From(List.ContainsAll(_, P) or not List.IsEmpty(List.RemoveItems(_, P)))
    }
  )
in
  C
Power Query solution 6 for Evaluate Student Subject Status, proposed by Maciej Kopczyński:
let
  source = Excel.CurrentWorkbook(){[Name = "tblStart"]}[Content], 
  lstSTEM = {"Maths", "Science"}, 
  lstOther = {"Philosophy", "English"}, 
  A = Table.AddColumn(
    source, 
    "SubjectGroups", 
    each if List.Contains(lstSTEM, [Subject]) then "STEM" else "OTHER", 
    type text
  ), 
  B = Table.Group(
    A, 
    {"Student", "SubjectGroups"}, 
    {
      {"CountAll", each Table.RowCount(_), Int64.Type}, 
      {"CountPass", each Table.RowCount(Table.SelectRows(_, each [Pass] = "Y")), Int64.Type}
    }
  ), 
  C = Table.AddColumn(
    B, 
    "Result", 
    each 
      if [SubjectGroups] = "STEM" then
        if [CountPass] > 0 then "Pass" else "Fail"
      else if [CountPass] = [CountAll] then
        "Pass"
      else
        "Fail"
  ), 
  D = Table.Group(
    C, 
    {"Student"}, 
    {"Result", each if not (List.Contains([Result], "Fail")) then "Pass" else "Fail"}
  )
in
  D
Power Query solution 7 for Evaluate Student Subject Status, proposed by Aleksandar Kovacevic:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  R = Table.Sort(
    Table.Group(
      Source, 
      "Student", 
      {
        "Result", 
        each [
          a = Table.SelectRows(_, (p) => p[Pass] = "N")[Subject], 
          b = {"Pass", "Fail"}{
            Byte.From(
              List.ContainsAny(a, {"Philosophy", "English"})
                or List.ContainsAll(a, {"Science", "Math"})
            )
          }
        ][b]
      }
    ), 
    "Student"
  )
in
  R
Power Query solution 8 for Evaluate Student Subject Status, proposed by Ezel K.:
let
 Kaynak = Excel.CurrentWorkbook(){[Name="Tablo1"]}[Content],
 #"Değiştirilen Değer" = Table.ReplaceValue(Kaynak,"Science","Maths",Replacer.ReplaceText,{"Subject"}),
 #"Birleştirilen Sütunlar" = Table.CombineColumns(#"Değiştirilen Değer",{"Subject", "Pass"},Combiner.CombineTextByDelimiter(":", QuoteStyle.None),"Birleştirilmiş"),
 #"Kaldırılan Yinelenenler" = Table.Distinct(#"Birleştirilen Sütunlar"),
 #"Filtrelenen Satırlar" = Table.SelectRows(#"Kaldırılan Yinelenenler", each ([Birleştirilmiş] <> "Maths:N")),
 #"Gruplanan Satırlar" = Table.Group(#"Filtrelenen Satırlar", {"Student"}, {{"Sayı", each Text.Combine([Birleştirilmiş]," / "), type text}}),
 #"Koşullu Sütun Eklendi" = Table.AddColumn(#"Gruplanan Satırlar", "Özel", each if Text.Contains([Sayı], ":N") then "Fail" else "Pass"),
 #"Kaldırılan Sütunlar" = Table.RemoveColumns(#"Koşullu Sütun Eklendi",{"Sayı"}),
 #"Sıralanan Satırlar" = Table.Sort(#"Kaldırılan Sütunlar",{{"Student", Order.Ascending}}),
 Result = Table.RenameColumns(#"Sıralanan Satırlar",{{"Özel", "Result"}})
in
 Result
                    
                  
          
            
  
                  
    
      
        Show translation
      
      
        Show translation of this comment

Solving the challenge of Evaluate Student Subject Status with Excel

Excel solution 1 for Evaluate Student Subject Status, proposed by 🇰🇷 Taeyong Shin:
=GROUPBY(A3:A18,
    C3:C18&B3:B18,
    LAMBDA(x,
    IF(SUM({0.1;0.1;1;1}*(XLOOKUP(
        {"m";"s";"p";"e"},
        x,
        RIGHT(
            x
        ),
        "Y",
        1
    )="Y"))>2,
    "Pass",
    "Fail")),
    ,
    0)
Excel solution 2 for Evaluate Student Subject Status, proposed by Alejandro Campos:
=LET(
 d, A3:C18,
 s, UNIQUE(FILTER(INDEX(d, , 1), INDEX(d, , 1) <> "")),
 g, LAMBDA(n,
 LET(
 r, FILTER(d, INDEX(d, , 1) = n),
 p, INDEX(r, , 2),
 b, INDEX(r, , 3),
 m, SUM((p = "Y") * ISNUMBER(MATCH(b, {"Maths", "Science"}, 0))),
 ph, IFERROR(INDEX(p, XMATCH("Philosophy", b)), "Y") = "Y",
 en, IFERROR(INDEX(p, XMATCH("English", b)), "Y") = "Y",
 IF(AND(m, ph, en), "Pass", "Fail"))),
 st, BYROW(s, LAMBDA(n, g(n))),
 SORT(HSTACK(s, st)))
Excel solution 3 for Evaluate Student Subject Status, proposed by Timothée BLIOT:
=LET(A,A3:A18,B,B3:B18,C,C3:C18,GROUPBY(A,MAP(A,B,C,LAMBDA(x,y,z,IF(OR(z="Maths",z="Science"),SUM(--(FILTER(B,(A=x)*((C="Science")+(C="Maths")),0)="Y")),--(y="Y")))),LAMBDA(x,IF(PRODUCT(x),"Pass","Fail")),,0))
Excel solution 4 for Evaluate Student Subject Status, proposed by Hussein SATOUR:
=LET(
    f,
    LAMBDA(
        t,
        x,
        INDEX(
            t,
            ,
            x
        )
    ),
    a,
    SORT(
        HSTACK(
            A3:B18,
            SUBSTITUTE(
                C3:C18,
                "Science",
                "Maths"
            )
        ),
        2,
        -1
    ),
    b,
    DROP(
        PIVOTBY(
            f(
                a,
                1
            ),
            XLOOKUP(
                f(
                a,
                1
            )&f(
                a,
                3
            ),
                f(
                a,
                1
            )&f(
                a,
                3
            ),
                f(
                    a,
                    2
                )
            ),
            f(
                a,
                1
            ),
            COUNTA,
            ,
            0
        ),
        1,
        -2
    ),
    IFS(
        ISNUMBER(
            b
        ),
        "Fail",
        b="",
        "Pass",
        1,
        b
    )
)
Excel solution 5 for Evaluate Student Subject Status, proposed by Duy Tùng:
=LET(I,
    INDEX,
    a,
    A3:A18,
    b,
    B3:B18="y",
    c,
    C3:C18,
    d,
    (c="Maths")+(c="Science"),
    e,
    (c="English")+(c="Philosophy"),
    u,
    GROUPBY(
        a,
        HSTACK(
            e,
            e*b,
            d,
            d*b
        ),
        SUM,
        ,
        0
    ),
    HSTACK(TAKE(
        u,
        ,
        1
    ),
    IF((I(
        u,
        ,
        2
    )=I(
        u,
        ,
        3
    ))+(I(
        u,
        ,
        4
    )<=I(
        u,
        ,
        5
    )+1)>1,
    "Pass",
    "Fail")))
Excel solution 6 for Evaluate Student Subject Status, proposed by Md. Zohurul Islam:
=LET(
    st,
    A3:A18,
    dt,
    B3:C18,
    
    u,
    VSTACK(
        "Philosophy",
        "English"
    ),
    
    v,
    VSTACK(
        "Maths",
        "Science"
    ),
    
    f,
    LAMBDA(
        x,
        y,
        FILTER(
            TAKE(
                x,
                ,
                1
            ),
            ISNUMBER(
                XMATCH(
                    DROP(
                x,
                ,
                1
            ),
                    y
                )
            ),
            0
        )="Y"
    ),
    
    z,
    DROP(
        REDUCE(
            "",
            SORT(
                UNIQUE(
                    st
                )
            ),
            LAMBDA(
                x,
                y,
                LET(
                    
                     a,
                    FILTER(
                        dt,
                        st=y
                    ),
                    
                     b,
                    AND(
                        f(
                            a,
                            u
                        )
                    ),
                    
                     c,
                    OR(
                        f(
                            a,
                            v
                        )
                    ),
                    
                     d,
                    IF(
                        AND(
                            b,
                            c
                        ),
                        "Pass",
                        "Fail"
                    ),
                    
                     e,
                    VSTACK(
                        x,
                        HSTACK(
                            y,
                            d
                        )
                    ),
                    e
                )
            )
        ),
        1
    ),
    
     z
)
Excel solution 7 for Evaluate Student Subject Status, proposed by Asheesh Pahwa:
=REDUCE(
    E2:F2,
    SORT(
        UNIQUE(
            A3:A18
        )
    ),
    LAMBDA(
        x,
        y,
        VSTACK(
            x,
            LET(
                f,
                FILTER(
                    B3:C18,
                    A3:A18=y
                ),
                t,
                TAKE(
                    f,
                    ,
                    1
                ),
                _t,
                TAKE(
                    f,
                    ,
                    -1
                ),
                I,
                IFS(
                    _t="Maths",
                    "Y",
                    _t="Science",
                    "Y",
                    TRUE,
                    t
                ),
                m,
                XMATCH(
                    _t,
                    {"Maths";"Science";"Philosophy";"English"}
                ),
                
                p(
                    I="Y"
                )*m,
                HSTACK(
                    y,
                    IF(
                        AND(
                            SIGN(
                                p
                            )
                        ),
                        "Pass",
                        "Fail"
                    )
                )
            )
        )
    )
)
Excel solution 8 for Evaluate Student Subject Status, proposed by Dhaval Patel:
=SORT(
    UNIQUE(
        $A$3:$A$18
    )
)

Formula for cell F3,
    
=IF(AND( IF((COUNTIFS(
    $A$3:$A$18,
     E3,
     $C$3:$C$18,
     "Maths"
) + COUNTIFS(
    $A$3:$A$18,
     E3,
     $C$3:$C$18,
     "Science"
)) > 0,
     (COUNTIFS(
         $A$3:$A$18,
          E3,
          $C$3:$C$18,
          "Maths",
          $B$3:$B$18,
          "Y"
     ) + COUNTIFS(
         $A$3:$A$18,
          E3,
          $C$3:$C$18,
          "Science",
          $B$3:$B$18,
          "Y"
     )) >= 1,
     TRUE),
     IF(
         COUNTIFS(
             $A$3:$A$18,
              E3,
              $C$3:$C$18,
              "English"
         ) > 0,
          COUNTIFS(
              $A$3:$A$18,
               E3,
               $C$3:$C$18,
               "English",
               $B$3:$B$18,
               "Y"
          ) >= 1,
          TRUE
     ),
     IF(
         COUNTIFS(
             $A$3:$A$18,
              E3,
              $C$3:$C$18,
              "Philosophy"
         ) > 0,
          COUNTIFS(
              $A$3:$A$18,
               E3,
               $C$3:$C$18,
               "Philosophy",
               $B$3:$B$18,
               "Y"
          ) >= 1,
          TRUE
     ) ),
     "Pass",
     "Fail")
Excel solution 9 for Evaluate Student Subject Status, proposed by ferhat CK:
=LET(a,DROP(PIVOTBY(A3:A18,B3:B18,C3:C18,ARRAYTOTEXT,,0,,0),1,-1),SORT(HSTACK(TAKE(a,,1),IF(REGEXTEST(TAKE(a,,-1),"Philosophy|English"),"Fail","Pass"))))
Excel solution 10 for Evaluate Student Subject Status, proposed by Erdit Qendro:
=LET(
    gC,
    {"Maths",
    "Science"},
    
    g,
    IF(
        ISNUMBER(
            XMATCH(
                C3:C18,
                gC,
                0
            )
        ),
        "MS",
        C3:C18
    ),
    
    pf,
    IF(
        B3:B18="Y",
        1,
        0
    ),
    pv,
    
    PIVOTBY(
        A3:A18,
        g,
        pf,
        MAX,
        ,
        0,
        ,
        0,
        
    ),
    
    HSTACK(
        TAKE(
            pv,
            1-ROWS(
                pv
            ),
            1
        ),
        
        IF(
            BYRO&W(
                DROP(
                    pv,
                    1,
                    1
                ),
                MIN
            ),
            "Pass",
            "Fail"
        )
    )
)
Excel solution 11 for Evaluate Student Subject Status, proposed by LUIS FLORENTINO COUTO CORTEGOSO:
=LET(
    p,
    PIVOTBY(
        A3:A18,
        C3:C18,
        B3:B18,
        CONCAT,
        ,
        0,
        ,
        0
    ),
    r,
    IF(
        DROP(
            p,
            1,
            1
        )="N",
        0,
        1
    ),
    s,
    IF(
        MMULT(
            r,
            {2;1;2;1}
        )>4,
        "Pass",
        "Fail"
    ),
    HSTACK(
        DROP(
            TAKE(
                p,
                ,
                1
            ),
            1
        ),
        s
    )
)

=LET(
    p,
    PIVOTBY(
        A3:A18,
        C3:C18,
        B3:B18,
        SINGLE,
        ,
        0,
        ,
        0
    ),
    r,
    BYROW(
        IF(
            p="",
            "Y",
            p
        ),
        LAMBDA(
            x,
            AND(
                OR(
                    INDEX(
                        x,
                        XMATCH(
                            {"Maths",
                            "Science"},
                            TAKE(
                                p,
                                1
                            ),
                            0
                        )
                    )="Y"
                ),
                AND(
                    INDEX(
                        x,
                        XMATCH(
                            {"English",
                            "Philosophy"},
                            TAKE(
                                p,
                                1
                            ),
                            0
                        )
                    )="Y"
                )
            )
        )
    ),
    VSTACK(
        {"Result",
        "Result"},
        DROP(
            HSTACK(
                TAKE(
                p,
                ,
                1
            ),
                IF(
                    r,
                    "Pass",
                    "Fail"
                )
            ),
            1
        )
    )
)

=LET(st,
    UNIQUE(
        SORT(
            A3:A18
        )
    ),
    su,
    TOROW(
        SORT(
            UNIQUE(
                C3:C18
            )
        )
    ),
    m,
    st&","&su,
    f,
    --(MAP(m,
    LAMBDA(x,
    FILTER($B$3:$B$18,
    ($A$3:$A$18=TEXTBEFORE(
        x,
        ","
    ))*($C$3:$C$18=TEXTAFTER(
        x,
        ","
    )),
    "Y")))="Y"),
    C,
    LAMBDA(
        x,
        CHOOSECOLS(
            f,
            XMATCH(
                x,
                su,
                0
            )
        )
    ),
    VSTACK({"Result",
    "Result"},
    HSTACK(st,
    IF((C(
        "Maths"
    )+C(
        "Science"
    ))*C(
        "English"
    )*C(
        "Philosophy"
    ),
    "Pass",
    "Fail"))))
Excel solution 12 for Evaluate Student Subject Status, proposed by Fredson Alves Pinho:
=LET(x,PIVOTBY(A3:A18,SUBSTITUTE(C3:C18,"Science","Maths"),B3:B18="Y",OR,,0,,0),DROP(IF({1,0},x,IF(BYROW(x,AND),"Pass","Fail")),1,-2))
Excel solution 13 for Evaluate Student Subject Status, proposed by Craig Runciman:
=LET(
    a,
    GROUPBY(
        HSTACK(
            A3:A18,
            SUBSTITUTE(
                C3:C18,
                "Science",
                "Maths"
            )
        ),
        B3:B18,
        LAMBDA(
            a,
            SUM(
                IF(
                    a="Y",
                    1,
                    0
                )
            )
        ),
        ,
        0
    ),
    r,
    GROUPBY(
        INDEX(
            a,
            ,
            1
        ),
        INDEX(
            a,
            ,
            3
        ),
        LAMBDA(
            z,
            IF(
                MIN(
                    z
                )=1,
                "Pass",
                "Fail"
            )
        ),
        ,
        0
    ),
    r
)
Excel solution 14 for Evaluate Student Subject Status, proposed by red craven:
=LET(
    e,
    C3:C18,
    p,
    DROP(
        PIVOTBY(
            A3:A18,
            IF(
                REGEXTEST(
                    e,
                    "M|S"
                ),
                "Z",
                e
            ),
            B3:B18="Y",
            OR,
            ,
            0
        ),
        1,
        -1
    ),
    HSTACK(
        TAKE(
            p,
            ,
            1
        ),
        IF(
            BYROW(
                DROP(
            p,
            ,
            1
        ),
                AND
            ),
            "Pass",
            "Fail"
        )
    )
)

Solving the challenge of Evaluate Student Subject Status with Python in Excel

Python in Excel solution 1 for Evaluate Student Subject Status, proposed by Alejandro Campos:
data = xl("A2:C18", headers=True)
s = {}
for stu, p, sub in zip(data["Student"], data["Pass"], data["Subject"]):
 s.setdefault(stu, {"Maths_or_Science": None, "Philosophy": None, "English": None})
 if sub in ["Maths", "Science"]:
 s[stu]["Maths_or_Science"] = p == 'Y' or s[stu]["Maths_or_Science"]
 elif sub in s[stu]:
 s[stu][sub] = p == 'Y'
df = pd.DataFrame([{"Student": k, "Status": "Pass" if all(v is not False for v in d.values()) else "Fail"} for k,
 d in s.items()]).sort_values("Student").reset_index(drop=True)
                    
                  
Python in Excel solution 2 for Evaluate Student Subject Status, proposed by Aditya Kumar Darak 🇮🇳:
df = xl("A2:C18", True)
pivot = df.pivot(index="Student", columns="Subject", values="Pass").fillna("NA")
result = (
 ((pivot["Maths"] == "Y") | (pivot["Science"] == "Y"))
 & (pivot["Philosophy"] != "N")
 & (pivot["English"] != "N")
)
result = result.map({True: "Pass", False: "Fail"}).reset_index(name="Result")
                    
                  

Solving the challenge of Evaluate Student Subject Status with R

R solution 1 for Evaluate Student Subject Status, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
path = "Excel/696 Pass or Fail.xlsx"
input = read_excel(path, range = "A2:C18")
test = read_excel(path, range = "E3:F7", col_names = c("Student", "Result"))
result = input %>%
 pivot_wider(names_from = Subject, values_from = Pass, values_fill = "Y") %>%
 mutate(Result = if_else((Maths == "Y" | Science == "Y") & English == "Y" & Philosophy == "Y", 
 "Pass", "Fail")) %>%
 select(Student, Result) %>%
 arrange(Student)
all.equal(result, test)
                    
                  

&&

Leave a Reply