intake class student_id
Sep 2022 - Eng English 100
Sep 2022 - Eng English 101
Nov 2022 - Sc Science 100
Jan 2023 - Bio Biology 101
Nov 2022 - Sc Science 102
Sep 2022 - Eng English 102
Jan 2023 - Bio Biology 102
Jan 2023 - Bio Biology 103
Jan 2023 - Bio Biology 105
Feb 2023 - Eng English 104
Feb 2023 - Eng English 103
大家好
我有一张如上所示的表格。表中的每一行代表将要参加课程的学生。例如,通过查看 2022 年 9 月的英语课,我知道 ID
100,101,102
的学生将参加该课程,而 100,102
的学生将参加 2022 年 11 月的科学课,等等...
我想要做的是将表格转换为另一种格式,它可以告诉当前正在上课的学生中有多少学生没有参加或不会参加其他课程。下表是预期输出:
我将展示如何获取屏幕截图中显示的表中的值:
当学生
100,101,102
参加2022年9月英语课时,其中三人:
101
)因为科学班名单中只有学生100,102
;100
)因为列表中只有学生 101,102
去上生物课,学生100
不在名单中。因此,2022 年 9 月 - 工程入学人数:
当学生
101,102,103,105
参加 2023 年 1 月生物课时,其中 4 人:
105
),因为学生101,102
参加了2022年9月的英语课,而学生103
将参加2023年2月的英语课;101,103,105
)因为科学班名单中只有学生102
;因此,2023 年 1 月 - 生物摄入量:
我一直在努力将数据转换为所需的格式,如屏幕截图中所示。事实上,我不确定是否可以使用 powerquery 或 DAX 来做到这一点。任何帮助或建议将不胜感激。如果我的问题不清楚,请告诉我。
向表中添加 3 个度量,如下所示:
no_science =
VAR ids = VALUES('Table'[student_id])
VAR ids_sci = CALCULATETABLE(VALUES( 'Table'[student_id]), REMOVEFILTERS('Table'), 'Table'[class] = "Science")
RETURN COUNTX( EXCEPT(ids, ids_sci), 'Table'[student_id])+0
no_english =
VAR ids = VALUES('Table'[student_id])
VAR ids_eng = CALCULATETABLE(VALUES( 'Table'[student_id]), REMOVEFILTERS('Table'), 'Table'[class] = "English")
RETURN COUNTX( EXCEPT(ids, ids_eng), 'Table'[student_id])+0
no_biology =
VAR ids = VALUES('Table'[student_id])
VAR ids_bio = CALCULATETABLE(VALUES( 'Table'[student_id]), REMOVEFILTERS('Table'), 'Table'[class] = "Biology")
RETURN COUNTX( EXCEPT(ids, ids_bio), 'Table'[student_id])+0
为了好玩,M 版本
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Grouped Rows" = Table.Group(Source, {"intake", "student_id"}, {{"data", each _, type table }}),
AllCombos =Table.ExpandListColumn( Table.AddColumn(#"Grouped Rows", "class", each List.Distinct(Source[class])), "class"),
T1 = Table.ExpandListColumn(Table.AddColumn(Table.FromList(List.Distinct(Source[class]), null,{"class"} ),"student_id", each List.Distinct(Source[student_id])), "student_id"),
#"Merged Queries0" = Table.NestedJoin(T1, {"class", "student_id"}, Source, {"class", "student_id"}, "Table1", JoinKind.LeftOuter),
StudentNo = Table.AddColumn(#"Merged Queries0", "No", each if Table.RowCount([Table1])=0 then 1 else 0),
#"Merged Queries" = Table.NestedJoin(AllCombos, {"student_id", "class"}, StudentNo, {"student_id", "class"}, "Table2", JoinKind.LeftOuter),
#"Expanded Table2" = Table.ExpandTableColumn(#"Merged Queries", "Table2", {"No"}, {"No"}),
#"Removed Columns" = Table.RemoveColumns(#"Expanded Table2",{"student_id", "data"}),
#"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[class]), "class", "No", List.Sum)
in #"Pivoted Column"