MDX - 包括空和非空

时间:2017-01-25 16:51:21

标签: reporting-services mdx

我有一个我在SSRS报告中使用的mdx查询。我想只返回> 50,但我想显示所有年份,无论是否有该年的数据。我可以得到> 50过滤器工作,但后来我失去了没有数据的年份。我已经尝试将这些年放在“页面”轴上,然后返回所有年份,但是当我这样做时,我的行轴不再尊重过滤器。我也尝试将年份维度置于NONEMPTY子句之外,但它再次不尊重> 50小时过滤。
以下是我到目前为止的样本:

SELECT 
  [measures].[Hours] ON COLUMNS
 ,
    [Date].[Year].[Year].ALLMEMBERS
  * 
    {
      Filter
      (
        NonEmpty
        (
          CrossJoin
          (
            [Client].[Client].[Client].ALLMEMBERS
           ,[Department].[Department].[Department].ALLMEMBERS
           ,[Title].[Title].[Title].ALLMEMBERS
           ,[Person].[Person].[Person].ALLMEMBERS
          )
         ,[Measures].[Billable Hours]
        )
       ,
        [Measures].[Billable Hours] >= 50
      )
    } ON ROWS
FROM TestCube;

即使没有数据,所需的结果仍然是显示2017年列,并且仅显示小时> 50表示有数据的列。

对此的任何帮助将不胜感激。我确实通过创建一个检查小时数>的计算成员找到了解决方法。 50,否则返回null。只是想知道是否有更好的方法来做到这一点。

谢谢, 希拉里

2 个答案:

答案 0 :(得分:0)

您可以尝试将OR ISEMPTY([Measures].[Billable Hours])添加到过滤条件中:

SELECT 
  [measures].[Hours] ON COLUMNS
 ,
    [Date].[Year].[Year].ALLMEMBERS
  * 
    {
      Filter
      (
        NonEmpty
        (
          CrossJoin
          (
            [Client].[Client].[Client].ALLMEMBERS
           ,[Department].[Department].[Department].ALLMEMBERS
           ,[Title].[Title].[Title].ALLMEMBERS
           ,[Person].[Person].[Person].ALLMEMBERS
          )
         ,[Measures].[Billable Hours]
        )
       ,
        [Measures].[Billable Hours] >= 50
            OR ISEMPTY([Measures].[Billable Hours])
      )
    } ON ROWS
FROM TestCube;

答案 1 :(得分:0)

您可以将算法移动到计算的度量中。它更快。过滤功能很慢。

with
Member [Measures].[Billable Hours 50More] as
IIF([Measures].[Billable Hours] >= 50, [Measures].[Hours], NULL)    

select 
[Measures].[Billable Hours 50More] on 0,
[Date].[Year].[Year].AllMembers * NonEmpty([Client].[Client].[Client].AllMembers * [Department].[Department].[Department].AllMembers * [Title].[Title].[Title].AllMembers * [Person].[Person].[Person].AllMembers, [Billable Hours 50More]) on 1

from TestCube