我想创建一个返回每年最后一个日期的集合。例如,所有往年都将返回12月,但当前年份只会返回当月。
WITH
SET testset AS
NonEmpty
(
Generate
(
{
OpeningPeriod([Date].[Calendar].[Month])
:
ClosingPeriod([Date].[Calendar].Month)
}
,{[Date].[calendar].CurrentMember}
)
,[Measures].[Sale Amount]
)
SELECT
NON EMPTY
(
[Measures].[Sale Amount]
,[Date].[Year].[Year]
) ON 0
,NON EMPTY
[testset] ON 1
FROM [Cube]
以下是返回每个月值的脚本示例。我尝试过使用tail和lastchild,但这只会返回最新版本。我希望每年都能回来。
答案 0 :(得分:3)
就上个月而言 - 忽略是否有数据:
WITH
SET [AllYears] AS
[Date].[Calendar].[Calendar Year].MEMBERS
SET [LastMths] AS
Generate
(
[AllYears] AS S
,Tail
(
Descendants
(
S.CurrentMember
,[Date].[Calendar].[Month]
)
,1
)
)
SELECT
{} ON 0
,[LastMths] ON 1
FROM [Adventure Works];
返回:
如果我想调整上述内容,以便它是每年的最后一个月有特定指标的数据,那么将NonEmpty
包裹在由Descendants
创建的集合周围:
WITH
SET [AllYears] AS
[Date].[Calendar].[Calendar Year].MEMBERS
SET [LastMths] AS
Generate
(
[AllYears] AS S
,Tail
(
NonEmpty //<<new
(
Descendants
(
S.CurrentMember
,[Date].[Calendar].[Month]
)
,[Measures].[Internet Sales Amount] //<<new
)
,1
)
)
SELECT
{} ON 0
,[LastMths] ON 1
FROM [Adventure Works];
它现在给了我们这个:
然后我们可以添加你在行上的元组(由于[Date].[Calendar]
已经在使用,我这次使用了属性层次结构多年了)
WITH
SET [AllYears] AS
[Date].[Calendar].[Calendar Year].MEMBERS
SET [LastMths] AS
Generate
(
[AllYears] AS S
,Tail
(
NonEmpty
(
Descendants
(
S.CurrentMember
,[Date].[Calendar].[Month]
)
,[Measures].[Internet Sales Amount]
)
,1
)
)
SELECT
NON EMPTY
(
[Measures].[Internet Sales Amount]
,[Date].[Calendar Year].[Calendar Year]
) ON 0
,[LastMths] ON 1
FROM [Adventure Works];
现在我们明白了:
答案 1 :(得分:2)
@Whytheq已经给出了一个非常好的解决方案。将此作为替代方案。这可能会tad
更快,因为它不使用GENERATE
函数(不确定!)。
有一个计算/立方体度量,它基本上可以判断一个月是否是一年中的最后一个月。然后选择几个月内的那些月份。
with member measures.islastchild as
iif
(
[Date].[Calendar].currentmember is
[Date].[Calendar].currentmember.parent.parent.parent.lastchild.lastchild.lastchild,
1,
null
)
如果月份是一年中的最后一个月,则成员measures.islastchild
将返回1。否则它将返回null
。
set lastmonths as
filter(
[Date].[Calendar].[Month].members,
measures.islastchild = 1
)
集合lastmonths
就是您需要的集合。
修改强>
为了进一步提高性能,您可以NonEmpty
功能而不是迭代FILTER
功能。
set lastmonths as
NonEmpty(
[Date].[Calendar].[Month].members,
measures.islastchild
)
select lastmonths on 1,
{} on 0
from [Adventure Works]
编辑2:获取销售额的最后一个月
with member measures.islastnonemptychild as
iif
(
[Date].[Calendar].currentmember is
TAIL(NonEmpty([Date].[Calendar].currentmember.parent.parent.parent.lastchild.lastchild.children, [Measures].[Sale Amount])).ITEM(0),
1,
null
)
set nonemptylastmonths as
NonEmpty(
[Date].[Calendar].[Month].members,
measures.islastnonemptychild
)