我想在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查询的新手,有关如何处理此问题的任何建议请...
答案 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中的列。