求助:将SQL分组查询转换为MDX脚本,创建SSAS员工数度量
把SQL员工统计逻辑转换为SSAS MDX度量
别担心,从SQL转MDX确实需要适应多维模型的思维方式,我来帮你把你的SQL逻辑转换成对应的MDX度量,一步步来拆解:
先理清你的SQL逻辑
你的SQL核心是按CODE_AFFECTATION分组,统计每个分组中DATE_FIN='2050-01-01'的员工数量,最终输出每个机构(AFFECTATION)、机构编码(CODE_AGENCE)对应的员工数。
对应SSAS模型的前提假设
首先假设你的SSAS多维模型里已经有这些维度/结构:
- 一个
[Collaborateur]维度,包含Matricule(员工编号)属性,用来唯一标识员工 - 一个
[Affectation]维度,包含CODE_AFFECTATION、AFFECTATION、CODE_AGENCE这些属性,对应SQL里的分组字段 - 员工的
DATE_FIN信息要么在[Collaborateur]维度里,要么在关联的事实表中
MDX度量的实现方案
根据你的需求,这里提供两种常用的MDX写法,你可以根据自己的模型结构调整:
方案1:使用Filter+Count筛选符合条件的员工
这种写法直接对应SQL的子查询逻辑,遍历所有员工并筛选符合条件的:
CREATE MEMBER CURRENTCUBE.[Measures].[Employee_Number] AS COUNT( Filter( -- 遍历所有员工编号成员 [Collaborateur].[Matricule].[Matricule].Members, -- 筛选条件1:当前员工的结束日期等于'2050-01-01' [Collaborateur].[Date Fin].CurrentMember.MemberValue = '2050-01-01' -- 筛选条件2:当前员工所属的CODE_AFFECTATION和维度中选中的分组一致 AND [Collaborateur].[Code Affectation].CurrentMember IS [Affectation].[Code Affectation].CurrentMember ) ), VISIBLE = 1;
方案2:使用SUM+IIF实现计数
这种写法通过求和来模拟计数,逻辑更直观,性能在大维度下可能更优:
CREATE MEMBER CURRENTCUBE.[Measures].[Employee_Number] AS SUM( [Collaborateur].[Matricule].[Matricule].Members, IIF( -- 判断当前员工是否属于当前Affectation分组且结束日期匹配 ([Affectation].[Code Affectation].CurrentMember, [Collaborateur].[Date Fin].[2050-01-01]) IS NOT NULL, 1, -- 符合条件计1 NULL -- 不符合不计入 ) ), VISIBLE = 1;
调整提示
如果你的DATE_FIN是存储在事实表中(而不是维度里),可以修改为以下写法,利用Existing函数关联当前上下文的分组:
CREATE MEMBER CURRENTCUBE.[Measures].[Employee_Number] AS COUNT( Filter( Existing [Collaborateur].[Matricule].[Matricule].Members, [Your_Fact_Table_Name].[Date Fin].CurrentMember.MemberValue = '2050-01-01' ) ), VISIBLE = 1;
验证效果
创建好度量后,你可以在SSAS的浏览器中拖入[Affectation].[Affectation]、[Affectation].[Code Agence]和新的[Measures].[Employee_Number],就能得到和你SQL查询完全一致的结果啦!
内容的提问来源于stack exchange,提问作者msadek oussama
相关产品推荐
相关产品推荐

