MDX查询中的case语句过滤器

时间:2013-12-04 19:52:03

标签: sql-server tsql ssas mdx

我想在MDX中编写以下T SQL查询

Select count(bugs),priority from table 
where
Case when priority =1 then startdate< dateadd(dd,-7,getdate())
     when priority =2 then startdate< dateadd(dd,-14,getdate())
end
group by priority

尝试以下但不能正常工作

WITH MEMBER [Measures].CHECKING 
AS 
CASE [Item].[ startdate].CurrentMember 
WHEN [Item].[ Priority].&[1] THEN [Item].[startdate]<DATEADD(DAY,-7,NOW())
WHEN [Item].[ Priority].&[2] THEN [Item].[startdate]<DATEADD(DAY,-14,NOW())
END

SELECT
NON EMPTY{[Measures].[Count], [Measures].CHECKING }ON COLUMNS
,NON EMPTY{([Item].[ Priority].[ Priority].ALLMEMBERS )}

我是MDX查询的新手,有关如何处理此问题的任何建议请...

2 个答案:

答案 0 :(得分:0)

您的CASE逻辑存在基本问题。该陈述不能导致条件。它只能产生一个值,然后与其他东西进行比较。

要采用您的tSQL示例,我认为它应该更像这样:

Select count(bugs),priority from table 
where
1 = Case when priority = 1 and startdate< dateadd(dd,-7,getdate()) Then 1
     when priority = 2 and startdate< dateadd(dd,-14,getdate()) then 1
     else 0 end
group by priority

更简洁的方法是完全跳过CASE。

Select count(bugs),priority from table 
where
  (priority = 1 and startdate< dateadd(dd,-7,getdate()))
  or
  (priority = 2 and startdate< dateadd(dd,-14,getdate()))
group by priority

答案 1 :(得分:0)

我假设以下内容:

  • 您的startdate层次结构是属性层次结构,而不是用户层次结构
  • 当天是最后一个成员。

然后下面的MDX应该提供你想要的东西:

SELECT
{ [Measures].[Count] }
ON COLUMNS
,
{  [Item].[ Priority].&[1], [Item].[ Priority].&[2] }
ON ROWS
FROM (
     SELECT ({ [Item].[ Priority].&[1] }
             *
             ([Item].[ startdate].[ startdate].Members
               - Tail([Item].[ startdate].[ startdate].Members, 7)
             )
            )
            +
            ({ [Item].[ Priority].&[2] }
             *
             ([Item].[ startdate].[ startdate].Members
               - Tail([Item].[ startdate].[ startdate].Members, 14)
             )
            )
     ON COLUMNS
     FROM [yourCube]
     )

由于以下几个原因,您的代码[Item].[startdate]<DATEADD(DAY,-7,NOW())在MDX中不起作用:首先,[Item].[startdate]是层次结构,因此无法使用<进行比较。其次,即使您将其重新声明为[Item].[startdate].CurrentMember < DATEADD(DAY,-7,NOW()),您也会在<的左侧有一个成员,并且有一个日期,即。即一个值,在右侧。 MDX要记住的重要事项之一是不同类型的对象:层次结构,级别,成员,元组,集合。所有这些都不是价值观。您不仅拥有SQL中的列。