我们有一个典型的日期维度。
我正在努力写一个MDX
来列出Dim.Year维度成员和度量严格包含所有月份的数据。(从1月到12月)否则排除年份?。
答案 0 :(得分:0)
此:
SELECT
[Measures].[Internet Sales Amount] ON 0
,[Date].[Calendar].[Calendar Year].MEMBERS ON 1
FROM [Adventure Works];
返回:
如果我现在加入NON EMPTY
我应该摆脱2009年和2010年:
SELECT
[Measures].[Internet Sales Amount] ON 0
,NON EMPTY
[Date].[Calendar].[Calendar Year].MEMBERS ON 1
FROM [Adventure Works];
现在返回:
以上是一个非常简单的例子
其他情况可能要求我们使用null
/ FILTER
/ NonEmpty
/ HAVING
等其他功能摆脱IIF
。
修改
为了回到有12个月数据的年份,我写了以下内容(比上面的内容更复杂!)。我稍后会尝试简化,但你肯定需要一个额外的措施来实现你的目标,
WITH
MEMBER [Measures].[cntMths] AS
Count
(
NonEmpty
(
Descendants
(
[Date].[Calendar].CurrentMember
,[Date].[Calendar].[Month]
,SELF
)
,[Measures].[Internet Sales Amount]
)
)
SELECT
{
[Measures].[Internet Sales Amount]
} ON 0
,NON EMPTY
[Date].[Calendar].[Calendar Year].MEMBERS HAVING
[Measures].[cntMths] = 12 ON 1
FROM [Adventure Works];
编辑(适用于@sourav_agasti)
这是针对Adventure Works
的解决方案,它只使用属性层次结构,即没有格式良好的日期维度的多维数据集:
WITH
MEMBER [Measures].[cntMths] AS
Count
(
NonEmpty
(
[Date].[Calendar Year].CurrentMember
*
[Date].[Month of Year].[Month of Year].MEMBERS
,[Measures].[Internet Sales Amount]
)
)
SELECT
{} ON 0
,[Date].[Calendar Year].[Calendar Year].MEMBERS HAVING
[Measures].[cntMths] = 12 ON 1
FROM [Adventure Works];
这相当于使用上述方法的Sourav脚本:
WITH
MEMBER [Measures].[cntMths] AS
Count
(
NonEmpty
(
[Dim Year].[Year].CurrentMember
*
[Dim Month].[Month].MEMBERS
,[Measures].[Foo]
)
)
SELECT
{} ON 0
,[Dim Year].[Year].[Year].MEMBERS HAVING
[Measures].[cntMths] = 12 ON 1
FROM [Your Cube];
进一步修改
昨晚我偶然发表了一篇文章,提供了一种更有效的方法。显然我在上面做过的Count - NonEmpty
没有调整到以块计算模式工作,而Sum -IIF
是。WITH
MEMBER [Measures].[cntMths - S] AS
Sum
(
[Date].[Month of Year].[Month of Year].MEMBERS
,IIF
(
IsEmpty([Measures].[Internet Sales Amount])
,null
,1
)
)
SELECT
{[Measures].[cntMths - S]} ON 0
,[Date].[Calendar Year].[Calendar Year].MEMBERS HAVING
[Measures].[cntMths - S] = 12 ON 1
FROM [Adventure Works];
。所以这是使用后一种方法的更快的替代方法:
{{1}}
答案 1 :(得分:0)
我把它作为一个挑战来编写一个代码,它可以在没有任何层次结构的情况下获得结果。所以这是我的尝试(经过几个小时的疯狂!)。
您也必须拥有[Dim Month]
尺寸。我假设存储的数据类似于Dec-2014
或Dec 2014
。基本上假设最后4位给出年份。
现在,您可以找出数据年份的一种方法是首先列出不拥有数据的所有月份,然后计算出这几个月的年份然后 NOT 在最终输出中显示这些年份。
以下代码适合您:
WITH SET MonthsWithNoData AS
FILTER([Dim Month].[Month].CHILDREN, [Measures].[foo] = 0)
MEMBER [Measures].Year as
RIGHT([Dim Month].[Month].CURRENTMEMBER.member_value, 4)
SET SetOfYearsWithNoData AS
GENERATE(MonthsWithNoData, STRTOSET("[Dim Year].[Year].&[" + RIGHT(MonthsWithNoData.currentmember.member_value, 4) + "]"))
SET SetOfYearsWithData AS
([Dim Year].[Year].MEMBERS - SetOfYearsWithNoData)
member yearValues as
[Dim Year].[Year].currentmember.member_value
member wellFormedyearValues as
[Dim Year].[Year].currentmember.member_unique_name
SELECT {yearvalues, wellFormedyearValues} on 0,
SetOfYearsWithData on 1
from [Your cube]
我同意最终输出看起来并不太漂亮。话虽如此,层次结构会使代码更简单,MDX会更简单。具有必要层次结构的[Calender]
维度(在@ whytheq&#39答案中假设)将是优雅和性能方面的更好方法。