Forum Discussion

jeronimo2334's avatar
jeronimo2334
Helper III
3 years ago
Solved

Create new table applying cartesian logic

Hello all, I have 3 tables, 2 of them are dimensional:

DIM TABLE - EXAMS

exam1
exam2
exam3


DIM TABLE - STUDENTS

student1
student2
student3


FACT TABLE - RESULTS

exam2student1fail
exam2student1pass
exam3student1pass
exam1student2fail
exam2student2pass
exam2student3pass
exam3student3pass


I am trying to get a new table combining all these tables, it needs a row for each exam and each student and whether they pass, failed or not taken then exam.
Note, student1 failed exam2 on the 1st row, but then passed it on the 2nd row. The expected table should only show the passed result.


EXPECTED TABLE

exam1student1not taken
exam2student1pass
exam3student1pass
exam1student2fail
exam2student2pass
exam3student2not taken
exam1student3not taken
exam2student3pass
exam3student3pass

 

Any help is appreciated.
Thanks.

  • AlB's avatar
    AlB
    3 years ago

    jeronimo2334  Updated to meet that additional requirement

     

    Place the following M code in a blank query to see the steps for your expected table. 

    See it all at work in the attached file.

     

    let
        Source = ExamsT,
        #"Added Custom" = Table.AddColumn(Source, "Custom", each StudentsT),
        #"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"Student"}, {"Student"}),
        #"Changed Type" = Table.TransformColumnTypes(#"Expanded Custom",{{"Student", type text}}),
        #"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Exam", "Student"}, ResultsT, {"Exam", "Student"}, "ResultsT", JoinKind.LeftOuter),
        #"Expanded ResultsT" = Table.ExpandTableColumn(#"Merged Queries", "ResultsT", {"Result"}, {"Result"}),
        #"Replaced Value" = Table.ReplaceValue(#"Expanded ResultsT",null,"Not taken",Replacer.ReplaceValue,{"Result"}),
        #"Sorted Rows" = Table.Buffer(Table.Sort(#"Replaced Value",{{"Exam", Order.Ascending}, {"Student", Order.Ascending}, {"Result", Order.Descending}})),
        #"Removed Duplicates" = Table.Distinct(#"Sorted Rows", {"Exam", "Student"})
    in
        #"Removed Duplicates"

     

     

    Please accept the solution when done and consider giving a thumbs up if posts are helpful. 

    Contact me privately for support with any larger-scale BI needs, tutoring, etc.

     

8 Replies

  • AlB's avatar
    AlB
    Community Champion

    Hi jeronimo2334 

    Place the following M code in a blank query to see the steps for your expected table. 

    See it all at work in the attached file.

    let
        Source = ExamsT,
        #"Added Custom" = Table.AddColumn(Source, "Custom", each StudentsT),
        #"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"Student"}, {"Student"}),
        #"Changed Type" = Table.TransformColumnTypes(#"Expanded Custom",{{"Student", type text}}),
        #"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Exam", "Student"}, ResultsT, {"Exam", "Student"}, "ResultsT", JoinKind.LeftOuter),
        #"Expanded ResultsT" = Table.ExpandTableColumn(#"Merged Queries", "ResultsT", {"Result"}, {"Result"}),
        #"Replaced Value" = Table.ReplaceValue(#"Expanded ResultsT",null,"Not taken",Replacer.ReplaceValue,{"Result"})
    in
        #"Replaced Value"

    Please accept the solution when done and consider giving a thumbs up if posts are helpful. 

    Contact me privately for support with any larger-scale BI needs, tutoring, etc.

     

    • jeronimo2334's avatar
      jeronimo2334
      Helper III

      Thank you! That is almost the expected result. I edited my post, adding a small gotcha.
      Issue being, a student can have multiple entries in the Results table, with a fail and a pass grade. The expected table should show only the pass if there is a case of multiple results. It should only show the fail result if there is no pass result.

      • AlB's avatar
        AlB
        Community Champion

        jeronimo2334

        Can the results only be pass or fail?

         

        Please accept the solution when done and consider giving a thumbs up if posts are helpful. 

        Contact me privately for support with any larger-scale BI needs, tutoring, etc.