在mdx中模拟group by

在mdx中模拟group by,mdx,olap,Mdx,Olap,我有一个事实表,其中列出了公司每位员工都通过的所有课程 FactPassedCourse:(CourseKey、EmployeeKey、DateKey) D雇员:(雇员钥匙) 迪姆库斯:(库塞基) 双职工 Emp1,Emp2 迪姆科 课程1,课程2,课程3,课程4,课程5 FactPassedCourse ----------------------------------------- (Emp1, Course1, DateKey1) (Emp1, Course2, DateKey2) (E

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

FactPassedCourse:(CourseKey、EmployeeKey、DateKey)

D雇员:(雇员钥匙)

迪姆库斯:(库塞基)

双职工 Emp1,Emp2

迪姆科 课程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查询,它返回了正确的结果,但是这个查询的性能非常慢

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 
     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

接受答案的另一种选择:

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

为什么你要像你一样在两个时刻减去
[All]
成员?为什么像你一样在两个时刻减去
[All]
成员?非常感谢。这是我想要的mdx查询。另一个问题是,如果我想根据FactPassedCourseCount中的值筛选数据库,我应该怎么做?因为当我使用过滤函数时,性能会很糟糕。@Nazanin如果你只想去掉空值/0,那么就始终使用
非空值
-性能更好-如果你想在
>100
这样的条件下过滤,那么你别无选择,只能使用
过滤器
和成员[measures].[Employee\u Count]作为计数(现有的非空(([DimEmployee]。[EmployeeKey]。[EmployeeKey]。[measures]。[FactPassedCourseCount],[DimDate]。[DateKey]。[DateKey1])选择0上的[measures]。[EmployeeKey]。[CurseKey]。[CourseKey],[measures]。[MyCube]中的[FactPassedCourseCount]);我编写了如上所述的查询。这很好,但性能不如您的查询(比上一个查询长约3秒)另外,NoneEmpty不会删除零值。非常感谢。这是我想要的mdx查询。另一个问题是,如果我想根据FactPassedCourseCount中的值筛选数据库,我应该怎么做?因为当我使用filter函数时,性能会很差。@Nazanin如果你只想删除null/0值,那么请始终使用
NoneEmpty
-性能更好-如果您想在
>100这样的条件下进行筛选,那么您别无选择,只能使用
筛选
,成员[measures].[Employee\u Count]作为计数(现有的非空(([diemployee].[EmployeeKey].[EmployeeKey],[measures].[FactPassedCourseCount])),[DimDate].[DateKey].&DateKey1])从[MyCube]中选择0上的[measures].[Employee_Count],1上的非空([DimCourse].[CourseKey].[CourseKey],[measures].[FactPassedCourseCount]);我编写了如上所述的查询。这很好,但性能不如您的查询(比上一个查询长约3秒)NoneEmpty也不会删除零值。