2017-03-08 63 views
0

我有对行和列的多个CROSSJOIN查询我要过滤的所有数据进行过滤与多个CROSSJOINs查询数据[Measures].[Flag] = 1 下面是一个例子:如何通过一个标志值

SELECT 
    { 
    NonEmpty 
    (
     CrossJoin 
     (
     { 
      [Time].[2016] 
     ,[Time].[2017] 
     } 
     ,CrossJoin 
     (
      { 
      [Quarters].[2 Quarter] 
      ,[Quarters].[1 Quarter] 
      } 
     ,{ 
      [Measures].[Load] 
      ,[Measures].[Flag] 
      } 
     ) 
    ) 
    ) 
    } ON ROWS 
,{CrossJoin([Industry].[Industry 1],[Client].[Set 1])} ON COLUMNS 
FROM [Cube] 
WHERE 
    [Version].[Actual]; 

如果我做这样的事情:

SELECT 
    { 
    NonEmpty 
    (
     CrossJoin 
     (
     { 
      [Time].[2016] 
     ,[Time].[2017] 
     } 
     ,CrossJoin 
     (
      { 
      [Quarters].[2 Quarter] 
      ,[Quarters].[1 Quarter] 
      } 
     ,{ 
      [Measures].[Load] 
      ,[Measures].[Flag] 
      } 
     ) 
    ) 
    ) 
    } ON ROWS 
,{ 
    Filter 
    (
     CrossJoin 
     (
     [Industry].[Industry 1] 
     ,[CLient].[Set 1] 
    ) 
    , 
     [Measures].[Flag] = 1 
    ) 
    } ON COLUMNS 
FROM [Cube] 
WHERE 
    [Version].[Actual]; 

我得到一个空集。在设置不用其他的过滤器的结果没有与Flag = 1

+0

我认为过滤器会为每列执行'[Measures]。[Flag]'的总和 - 如果总和为1,那么保持列...但我怀疑每个[Measures] 。[标志]'列是大于1 – whytheq

回答

0

嗨我找到了解决这个问题的办法。解决方法是使用不同的过滤器。这里有一个例子:

的一件大事这里要注意的是,在特定的空间配置中提供“标志”的数据。

SELECT 
    { 
    NonEmpty 
    (
     CrossJoin 
     (
     { 
      [Time].[2016] 
     ,[Time].[2017] 
     } 
     ,CrossJoin 
     (
      { 
      [Quarters].[2 Quarter] 
      ,[Quarters].[1 Quarter] 
      } 
     ,{ 
      [Measures].[Load] 
      ,[Measures].[Flag] 
      } 
     ) 
    ) 
    ) 
    } ON ROWS 
,{ 
    Filter 
    (
     CrossJoin 
     (
     [Industry].[Industry 1] 
     ,[CLient].[Set 1] 
    ) 
    , 
     (
     [Cube].(
       [Time].[2016], 
       [Quarters].[1 Quarter], 
       [Measures].[Flag] 
      ) = 1 
    ) 
    ) 
    } ON COLUMNS 
FROM [Cube] 
WHERE 
    [Version].[Actual]; 
1

数据如果你只是把它移动到HAVING子句有何帮助?

SELECT 
    { 
    NonEmpty 
    (
     CrossJoin 
     (
     { 
      [Time].[2016] 
     ,[Time].[2017] 
     } 
     ,CrossJoin 
     (
      { 
      [Quarters].[2 Quarter] 
      ,[Quarters].[1 Quarter] 
      } 
     ,{ 
      [Measures].[Load] 
      ,[Measures].[Flag] 
      } 
     ) 
    ) 
    ) 
    } ON ROWS 
, 
     CrossJoin 
     (
     [Industry].[Industry 1] 
     ,[CLient].[Set 1] 
    ) 
    having [Measures].[Flag] = 1 ON COLUMNS 
FROM [Cube] 
WHERE 
    [Version].[Actual]; 
+0

我已经测试此。给了我Cognos TM1的语法错误。 – Mindaugas

+0

@Mindaugas我发现这个关于使用具有在Cognos的:https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014464971 – whytheq

+0

我已经找到了解。我必须使用不同的过滤器。 – Mindaugas