Forum Discussion

DThayer's avatar
DThayer
Frequent Visitor
8 years ago
Solved

Teachers with Students in common

Atttempting to create a matrix of intersecting students - meaning what teachers have how many common students, and eventually being able to see the students.  Source is simply 2 columns, although the...
  • Zubair_Muhammad's avatar
    Zubair_Muhammad
    8 years ago

    DThayer

     

    Here is another way.

     

    First create a new Table from the Modelling Tab>>New Table

    Table =
    ALL ( Table1[Teachers] )
    


    Now you can use this MEASURE in your original Table (say Table1)

    Measure =
    VAR mytable =
        UNION ( VALUES ( Table1[Teachers] ), VALUES ( 'Table'[Teachers] ) )
    VAR myrows =
        COUNTROWS ( DISTINCT ( mytable ) )
    VAR M1 =
        COUNTROWS (
            FILTER (
                VALUES ( Table1[Students] ),
                CALCULATE ( COUNT ( Table1[Teachers] ), Table1[Teachers] IN mytable )
                    = 2
            )
        )
    VAR M2 =
        COUNT ( Table1[Students] )
    VAR M3 =
        IF ( myrows = 1, M1, M2 )
    RETURN
        IF ( ISBLANK ( M3 ), 0, M3 )
    



  • DThayer's avatar
    DThayer
    8 years ago

    Power Query solution:

    Table Students:

     

    TeacherStudent

    Teacher AStudent 1
    Teacher AStudent 2
    Teacher AStudent 3
    Teacher AStudent 4
    Teacher BStudent 1
    Teacher BStudent 5
    Teacher BStudent 7
    Teacher BStudent 8
    Teacher CStudent 3
    Teacher CStudent 4
    Teacher CStudent 7
    Teacher CStudent 8
    Teacher DStudent 5
    Teacher DStudent 9
    Teacher DStudent 10

     

    Create 2 tables of distinct teachers with a second column of "1" to join the tables together:

    Students(2):

    TeacherCustom

    Teacher A1
    Teacher B1
    Teacher C1
    Teacher D1

     Students(3):

    TeacherCustom

    Teacher A1
    Teacher B1
    Teacher C1
    Teacher D1

     

    Now merge the 2 new tables, creating a list of all possible combinations of teacher relationships.  Next, merge the newly created list back to the "Students"  - twice - once on column "Teacher" and then on column "Teacher.1".  Add a column to denote if the students match, then filter out non-matches.  Group the data by "Teacher" and "Teacher.1" to get the count, then simply pivot the data around "Teacher.1".  Here is the actual code:

     

     

    let
        Source = Table.NestedJoin(#"Students (3)",{"Custom"},#"Students (2)",{"Custom"},"Students (2)",JoinKind.LeftOuter),
        #"Expanded Students (2)" = Table.ExpandTableColumn(Source, "Students (2)", {"Teacher"}, {"Teacher.1"}),
        #"Removed Columns" = Table.RemoveColumns(#"Expanded Students (2)",{"Custom"}),
        #"Merged Queries" = Table.NestedJoin(#"Removed Columns",{"Teacher"},Students,{"Teacher"},"Students",JoinKind.LeftOuter),
        #"Expanded Students" = Table.ExpandTableColumn(#"Merged Queries", "Students", {"Student"}, {"Student"}),
        #"Merged Queries1" = Table.NestedJoin(#"Expanded Students",{"Teacher.1"},Students,{"Teacher"},"Students",JoinKind.LeftOuter),
        #"Expanded Students1" = Table.ExpandTableColumn(#"Merged Queries1", "Students", {"Student"}, {"Student.1"}),
        #"Added Custom" = Table.AddColumn(#"Expanded Students1", "Match", each if [Student] = [Student.1] then 1 else 0),
        #"Filtered Rows" = Table.SelectRows(#"Added Custom", each ([Match] = 1)),
        #"Removed Columns1" = Table.RemoveColumns(#"Filtered Rows",{"Student", "Student.1"}),
        #"Grouped Rows" = Table.Group(#"Removed Columns1", {"Teacher", "Teacher.1"}, {{"Count", each Table.RowCount(_), type number}}),
        #"Pivoted Column" = Table.Pivot(#"Grouped Rows", List.Distinct(#"Grouped Rows"[Teacher.1]), "Teacher.1", "Count", List.Sum)
    in
        #"Pivoted Column"