如何在某些条件下获取一组CON的NON-NULL成员?

时间:2014-10-22 11:20:35

标签: mdx ssas-2012

为了解决问题的背景,某些“用户”会执行某些“任务”,这些“任务”被分类为各种类型;一种这样的类型是“DSR”。我面临的要求是找到 2013年每个月用户ID 033343处理的DSR类型的请求数量。
我需要的是获取用户(Userid = 033343)在年份= 2013中处理的所有不同请求的set中的成员计数以及请求类型= DSR。 以下是我最初尝试的内容:

WITH SET requests AS
EXISTING [Request].[RequestID].MEMBERS

MEMBER Measures.[Count033343] AS
DISTINCTCOUNT(requests)

SELECT Measures.[Count033343] ON 1,
[Calendar].[CalendarMonthName].CHILDREN ON 0 /*Values like January, February, etc. Not tied to Calendar Years*/
FROM [Model]
WHERE(
                 [User].[UserID].&[033343],
                 [Request Type].[Request Type Name].&[DSR],
                 [Calendar].[CalendarYear].&[2013]

      )

但那没用。我得到了以下结果。

Tuple in where clause

我想,我正在构建的那个集合存在问题。

然后我将MDX移动到Set定义。我认为与WHERE子句中有一组额外的元组相比,它可能会使代码更快地运行。

WITH SET requests AS
EXISTS([Request].[RequestID].MEMBERS, (
                     [User].[UserID].&[033343],
                     [Request Type].[Request Type Name].&[DSR],
                     [Calendar].[CalendarYear].&[2013]
      ))

MEMBER Measures.[Count033343] AS
DISTINCTCOUNT(requests)

SELECT Measures.[Count033343] ON 1,
[Calendar].[CalendarMonthName].MEMBERS ON 0
FROM [Model]

但我仍然得到与上述相同的结果 - 0作为所有月份的计数!

然后,我想到检查我正在构建的集合(在第二个例子中)

WITH SET requests AS
EXISTS([Request].[RequestId].MEMBERS, (
                     [User].[UserID].&[033343],
                     [Request Type].[Request Type Name].&[DSR],
                     [Calendar].[CalendarYear].&[2013]
      ))

SELECT [Measures].[Average of Late Tasks] ON 1,
requests ON 0
FROM [Model]

enter image description here

这证明了两件事。

1)该集合返回NULL值以及非空值。

2)确实从集合中返回了Request Ids。因此,对于指定的元组,请求的数量肯定大于0。

我可以使用NON EMPTY子句删除NON NULL值但是,我不想使用它,因为我读到它增加了开销。

正如我上面已经验证的那样,对于2013年所有的各种用户确实有请求,为什么我得到了计数是0?我哪里错了?为什么EXISTSEXISTING功能不按预期工作?该集合是否应仅返回条件 存在 的请求ID?我的理解错了吗?

修改

对于@whytheq - 在您的最终查询中,我获得了非零值

WITH MEMBER Measures.[x] AS
   Count(
     NONEMPTY(
       [Request].[RequestId].MEMBERS
       , {([Measures].[Average of Late Tasks])}
     )      
   )
SELECT 
   Measures.[x] ON 0,
   [Calendar].[CalendarYear].&[2013] ON 1 
FROM [Model]

输出

       x
2013   2

1 个答案:

答案 0 :(得分:0)

(未测试)这仍然会返回零吗?

WITH SET [requests] AS
  {([User].[UserID].&[033343],
  [Request Type].[Request Type Name].&[DSR])}
  * {[Measures].[Average of Late Tasks]}  //<<<<try running with and without this line
  * [Request].[RequestID].MEMBERS
MEMBER Measures.[Count033343] AS
  DISTINCTCOUNT(requests)
SELECT 
  [Calendar].[CalendarMonthName].CHILDREN ON 0,
  Measures.[Count033343] ON 1 
FROM [Model]
WHERE(
      [Calendar].[CalendarYear].&[2013]
      ) 

以下情况如何?

WITH 
  MEMBER Measures.[Count033343] AS
    DISTINCTCOUNT({[Request].[RequestID].[RequestID]})
SELECT 
  [Calendar].[CalendarMonthName].CHILDREN ON 0,
  Measures.[Count033343] ON 1 
FROM [Model]
WHERE(
      [Calendar].[CalendarYear].&[2013],
      [User].[UserID].&[033343],
      [Request Type].[Request Type Name].&[DSR]
      ) 

也许首先尝试这个更简单的查询(如果它有效!)我们可以从中构建以尝试找到问题......

WITH MEMBER Measures.[x] AS
   Count(
     NONEMPTY(
       [Request].[RequestId].MEMBERS
       , {([Measures].[Average of Late Tasks])}
     )      
   )
SELECT 
   Measures.[x] ON 0,
   [Calendar].[CalendarYear].&[2013] ON 1 
FROM [Model]