在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
我有一个事实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