在mdx中模拟group by
我有一个事实表,其中列出了公司每位员工都通过的所有课程 FactPassedCourse:(CourseKey、EmployeeKey、DateKey) D雇员:(雇员钥匙) 迪姆库斯:(库塞基) 双职工 Emp1,Emp2 迪姆科 课程1,课程2,课程3,课程4,课程5在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
-----------------------------------------
(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也不会删除零值。