对入学人数进行分组,并确定入学学生中未注册其他班级的学生人数

问题描述 投票:0回答:2
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 月 - 工程入学人数:

  • 无英语= 0
  • 无科学 = 1
  • 无生物学= 1

再举一个例子

当学生

101,102,103,105
参加 2023 年 1 月生物课时,其中 4 人:

  • 其中一人没有参加或不会参加英语课(学生
    105
    ),因为学生
    101,102
    参加了2022年9月的英语课,而学生
    103
    将参加2023年2月的英语课;
  • 其中三人没有参加或不打算参加科学课(学生
    101,103,105
    )因为科学班名单中只有学生
    102
  • 他们没有人没有参加或不会参加生物课,因为他们现在都在上生物课。

因此,2023 年 1 月 - 生物摄入量:

  • 无英语= 1
  • 无科学 = 3
  • 无生物学= 0

我一直在努力将数据转换为所需的格式,如屏幕截图中所示。事实上,我不确定是否可以使用 powerquery 或 DAX 来做到这一点。任何帮助或建议将不胜感激。如果我的问题不清楚,请告诉我。

powerbi dax powerquery powerbi-desktop measure
2个回答
2
投票

向表中添加 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

2
投票

为了好玩,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"
© www.soinside.com 2019 - 2024. All rights reserved.