MDX - 动态排除/包含

时间:2017-12-07 19:20:00

标签: reporting-services ssas mdx ssrs-2012 business-intelligence

我正在创建一个将由包装器应用程序使用的SSRS报告。此应用程序将传递一个字符串参数,该参数可选地指定是否应该对“常规员工”或“临时员工”(temp是一组员工类型)过滤查询,并且我正在努力将最佳方法编码到MDX查询。

可能的字符串参数值:

  • “常规员工”
  • “临时雇员”

我的参数表达式修改传递给查询的参数值:

=SWITCH(
  Parameters!t.Value = "Regular Employee",
  "{[Employee Type].[Hierarchy].[Employee Type].&[2]
  ,[Employee Type].[Hierarchy].[Employee Type].&[3]}",
  Parameters!t.Value = "Temporary Employee",
  "[Employee Type].[Hierarchy].[Employee Type].&[1]",
  1=1,
  "[Employee Type].[Hierarchy].[Employee Type].&[99999]"
)

请注意,我正在指定反向并使用排除,以便我的catch-all实际上不包括任何内容

最后是MDX查询:

SELECT
  [Measures].[Headcount] ON COLUMNS,
Except([Employee Type].[Hierarchy].children, {StrToSet(@t)}) ON ROWS
FROM [GER]

现在,这很好用,我只是不喜欢这个查询的可维护性。

  1. 假设[99999]永远不会是有效的员工类型密钥
  2. 对于“常规员工”的单一类型的情况,已硬编码要排除的所有内容。如果数据模型已更新并且将来包含其他员工类型,则会中断。
  3. 如果将来任何员工类型键发生变化,则会中断
  4. 所以我意识到它很难看,它只是我现在唯一的工作示例。假设我无法修改包装器应用程序以更改参数值的传递方式,那么任何人都可以看到更好的方法来为此方案编写MDX,这是更具未来性的证据吗?我真的希望这个数据模型的键使用字符串值而不是递增数字键。这将是更安全的imo,我应该能够通过引用名称来实现这种类型的过滤器....不知怎的?

0 个答案:

没有答案