在mdx中模拟group by

Simulate group by in mdx

我有一个事实Table,其中列出了公司每位员工都已通过的所有课程。

FactPassedCourse:(CourseKey、EmployeeKey、DateKey)

DimEmployee: (EmployeeKey)

DimCourse:(课程关键字)

昏暗的员工

Emp1 , Emp2

DimCourse

课程 1、课程 2、课程 3、课程 4、课程 5

FactPassedCourse
-----------------------------------------
(Emp1, Course1, DateKey1)
(Emp1, Course2, DateKey2)
(Emp1, Course2, DateKey3)
(Emp1, Course3, DateKey3)
(Emp1, Course4, DateKey3)
(Emp2, Course4, DateKey1)
(Emp2, Course5, DateKey5)

DimEmployee 和 DimCourse 与我的多维数据集中的 FactPassedCourse 有规律的关系。

我想根据每门课程计算员工人数,但如果一名员工多次通过特殊课程(如课程 2),则必须只计算该员工一次我的意思是我想要的结果:

MDX 结果:

(Coursename: Course1    Employee_Count: 1)
(Coursename: Course2    Employee_Count: 1:because ONE employee passed this course two times)
(Coursename: Course3    Employee_Count: 1)
(Coursename: Course4    Employee_Count: 2: because two different employees passed this course)
(Coursename: Course5    Employee_Count: 1)

为了得到这个结果,我写了这个 mdx 查询,这个 return 是正确的结果,但是这个查询的性能很慢。

With 
  Member [measures].[Employee_Count] as 
     Count(
        Filter(
          [DimEmployee].EmployeeKey].members-[DimEmployee].[EmployeeKey].[All]),
          [measures].[FactPassedCourseCount]>0)
        )
  Set [Course_Set] as 
     Filter(
       ([DimCourse].[CourseKey].members–[DimCourse].CourseKey].[All]),
        [measures].[FactPassedCourseCount] > 0
     )
Select 
   [measures].[Employee_Count] on 0
 , [Course_Set] on 1 
From MyCube

本查询结果为:

(Coursename: Course1    Employee_Count: 1)
(Coursename: Course2    Employee_Count)
(Coursename: Course3    Employee_Count: 1)
(Coursename: Course4    Employee_Count)
(Coursename: Course5    Employee_Count: 1)

有没有更好的方法来编写这个具有快速性能的 mdx 查询?

这样更快吗?

With 
  Member [measures].[Employee_Count] as 
     Count(
        EXISTING 
           NONEMPTY(
             [DimEmployee].[EmployeeKey].[EmployeeKey]
            ,[measures].[FactPassedCourseCount]
           )
        )
Select 
   [measures].[Employee_Count] on 0
 , NONEMPTY(
      [DimCourse].[CourseKey].[CourseKey]
     ,[measures].[FactPassedCourseCount]
   ) on 1 
From [MyCube];

已接受答案的替代方案 -

with member [measures].[Employee_Count] AS
NonEmpty
    (
     [DimEmployee].EmployeeKey].[EmployeeKey].members,
     ([DimCourse].[CourseKey].Currentmember, [measures].[FactPassedCourseCount])
    ).Count


Select 
   [measures].[Employee_Count] on 0
 , [Course_Set] on 1 
From MyCube

此外,如果您想根据任何值进行过滤,有一种方法可以不使用 filter

with
member measures.GrtThan5 as
IIF(
    [Measures].[Claim As Of - Count] > 5,
    1,
    NULL
   )

定义必须更改为以下 -

member [measures].[Employee_Count] AS
NonEmpty
    (
     [DimEmployee].EmployeeKey].[EmployeeKey].members,
     ([DimCourse].[CourseKey].Currentmember, [measures].GrtThan5)
    ).Count