如何在Excel中将DAX中的其他行与其他行进行比较

我有这张表有几个其他键的外键:

在这里输入图像说明

基本上,这个表格显示哪个学生注册了哪个模块由哪个教师在哪个学期运行。

我想查询以下内容:

How many students have registered for more than one module run by a given tutor?

它看起来像这样:

在这里输入图像说明

例如,Vasiliy Kuznetsov运行两个模块:FunPro和NO。 如果一个学生注册了他们两个,他算作一个。

我面向sql的头脑告诉我这一点:统计所有的行student_id和tutor_id是相同的。 例如,在一行中,student_id是5,tutor_id是10,第三行也是一样的。 那么,我把它算作一个。

我如何使用DAX公式来做到这一点?

 RowCount:= COUNTROWS( ModuleRegistration ) StudentsWithTwoOrMoreRegistrations:= COUNTROWS( FILTER( VALUES( ModuleRegistration[Student_ID] ) ,[RowCount] >= 2 ) ) 

我在位置上引用参数,因此函数的第一个参数是(1),第二个(2)等等。

所以,[RowCount]是微不足道的。

[StudentsWithTwoOrMoreRegistrations]有一点涉及。 DAX是一种function性语言,从内到外都是最好的理解。

在(1)中,FILTER()接受一个expression式并为(1)中的每一行计算一个布尔谓词(2)。 它从(1)返回(2)评估为真的所有行。

我们的FILTER()(1)是VALUES(ModuleRegistration [Student_ID])。 VALUES()根据当前的filter上下文(它关注数据透视表中的分片器和filter)返回一个字段中的唯一行。 因此,我们将返回[Student_ID]的唯一列表的一部分。

我们的FILTER()(2)是[RowCount]> = 2.对于(1)中的每个[Student_ID],我们将评估[RowCount],检查该学生在ModuleRegistration中出现的次数。 [RowCount]在来自透视表的filter上下文(示例透视图中的[Faculty Name]字段提供filter上下文)和来自FILTER()(1)的行上下文的组合中评估。 因此,它将计算学生在数据透视表行的[Faculty Name]的ModuleRegistration中出现的次数。

我们检查[RowCount]是否> = 2。

你还没有表明你的措施是否需要处理总计,或者你可能希望看到。 如果你需要更多的帮助才能让它按照你喜欢的方式行事,请告诉我。

编辑总计

有几种方法可能需要处理总计。 我龚认为你想要一个独特的学生数量。

 StudentsWithTwoOrMoreRegistrations:= COUNTROWS( SUMMARIZE( FILTER( SUMMARIZE( ModuleRegistration ,ModuleRegistration[Tutor_ID] ,ModuleRegistration[Student_ID] ) ,[RowCount] >= 2 ) ,ModuleRegistration[Student_ID] ) ) 

WTF发生在我们的措施?

让我们来看看:

从最内层的SUMMARIZE()开始。 SUMMARIZE()从(1)中的表格向外导航关系,并按照(2) – (N)中列出的列向外导航关系(这些不必是来自(1)中的表格,但必须通过导航关系)。

这相当于SQL中的以下内容:

 SELECT mr.Tutor_ID ,mr.Student_ID FROM ModuleRegistration mr 

我们像前面一样在这个表上使用FILTER()。 [RowCount]是在透视表的filter上下文和表中的行(由上面的SUMMARIZE()定义)的组合中评估的。

现在我们的排队环境不仅仅是一个学生,一个学生导师对。 如果学生从辅导教师处接受了多个模块,则这对儿童的[RowCount]> = 2。

我们的FILTER()返回有一个[RowCount]> = 2的对。这个输出表有两个字段,[Tutor_ID]和[Student_ID],但是我们要计数不同的[Student_ID]。

因此,我们使用FILTER()中的表作为我们在外部SUMMARIZE()中的(1)。 我们只按[Student_ID]的值进行分组。 然后我们计算这个表的行数。

当只有一个[Faculty_Name]在上下文中时,例如在一个数据透视表行上,那么我们的内部SUMMARIZE()就是由[Tutor_ID]的一个单独值和任何[Student_ID]与它关联的。 这与我们先前的措施相同。

当我们在上下文中有许多[Tutor_ID]时,就像总计一样,那么我们将看到仅对每个[Student_ID]进行一次计数的恰当行为。