我正在处理如下要求,我所拥有的解决方案要么不是解决完整问题,要么是非常慢,在许多情况下是不可行的。需要一点帮助。
问题:需要一个显示一系列具有4维(10个级别)交叉连接和日期维度的度量的查询,我需要确定度量的跨时段的第一个可用值,例如月初,年初等等..
我有
查询:
SELECT
NON EMPTY {[Measures].[M1],
[Measures].[M2],
[Measures].[M3],
[Measures].[M4],
[Measures].[M5],
[Measures].[M1SOM]} ON COLUMNS
,NON EMPTY
{
[DimA].[A1].[A1].ALLMEMBERS*
[DIMB].[B1].[B1].ALLMEMBERS*
[DIMB].[B2].[B2].ALLMEMBERS*
[DIMB].[B3].[B3].ALLMEMBERS*
[DIMB].[B4].[B4].ALLMEMBERS*
[DIMB].[B5].[B5].ALLMEMBERS*
[DIMC].[C1].[C1].ALLMEMBERS*
[DIMD].[D1].[D1].ALLMEMBERS*
[DIMD].[D2].[D2].ALLMEMBERS*
[DIMD].[D3].[D3].ALLMEMBERS*
[Date].[Date].[Date].ALLMEMBERS*
[Date].[Month].[Month].ALLMEMBERS*
} ON ROWS
FROM [Cube]
***上述查询具有所有这些交叉连接,因为此查询将为SSRS报告数据集提供支持。
我需要创建一个新的计算度量或一个真实的(持久性度量),它显示月份的开始和时间。年初价值观。以下是我目前的选择。假设,测量M1是我需要SOM和SOY值的那个。
根据度量M1创建一个持久性度量(M1SOM)并提供“FirstNonEmpty”的聚合函数:当我们在月级运行查询时,即上述情况下,这非常有效查询有[日期]。[月]。[月]。所有成员而不是[日期]。[日期]。[日期]。所有成员。它显示该月的第一个可用的非空值。但是,这意味着其他措施在月级汇总。如果我想显示其他度量的每日值以及此度量的SOM值,它将无法工作,因为范围现在更改为单个日期,我只是获得M1SOM度量中的每日值。
如下创建计算度量(M1SOM),以及上面的查询,同样的事情发生。无法在每日日期级别显示SOM值。
WITH MEMBER [Measures].[M1SOM] AS ([Date].[Date].FirstChild,[Measures].[M1])
创建一个计算成员,如下所示,这有效!然而,查询绝对会杀死我的计算机并且需要永远执行,如果我在交叉连接中运行超过3个级别。
WITH MEMBER M1SOM AS Head(NonEmpty({[Date].[Date].Parent.Children}*[Measures].[M1SOM])).Item(0)
是否有更好的方法在日常水平上实现SOM和SOY计算?
由于
SRIKANTH
答案 0 :(得分:0)
(这是未经测试的)
这是否会返回当月的第一个日期:
WITH MEMBER [Measures].[FirstDayOfMonth] AS
OpeningPeriod(
[Date].[Date].[Date],
[Date].[Date].CURRENTMEMBER.PARENT
).MemberValue
SELECT
NON EMPTY {[Measures].[M1],
[Measures].[M2],
[Measures].[M3],
[Measures].[M4],
[Measures].[M5],
[Measures].[FirstDayOfMonth] } ON COLUMNS
,NON EMPTY
{
[DimA].[A1].[A1].ALLMEMBERS*
[DIMB].[B1].[B1].ALLMEMBERS*
[DIMB].[B2].[B2].ALLMEMBERS*
[DIMB].[B3].[B3].ALLMEMBERS*
[DIMB].[B4].[B4].ALLMEMBERS*
[DIMB].[B5].[B5].ALLMEMBERS*
[DIMC].[C1].[C1].ALLMEMBERS*
[DIMD].[D1].[D1].ALLMEMBERS*
[DIMD].[D2].[D2].ALLMEMBERS*
[DIMD].[D3].[D3].ALLMEMBERS*
[Date].[Date].[Date].ALLMEMBERS*
[Date].[Month].[Month].ALLMEMBERS*
} ON ROWS
FROM [Cube]
(再次未经测试)
WITH MEMBER [Measures].[FirstDayOfMonthM1] AS
(
OpeningPeriod(
[Date].[Date].[Date],
[Date].[Date].CURRENTMEMBER.PARENT
),
[Measures].[M1]
)
SELECT
NON EMPTY {[Measures].[M1],
[Measures].[M2],
[Measures].[M3],
[Measures].[M4],
[Measures].[M5],
[Measures].[FirstDayOfMonthM1] } ON COLUMNS
,NON EMPTY
{
[DimA].[A1].[A1].ALLMEMBERS*
[DIMB].[B1].[B1].ALLMEMBERS*
[DIMB].[B2].[B2].ALLMEMBERS*
[DIMB].[B3].[B3].ALLMEMBERS*
[DIMB].[B4].[B4].ALLMEMBERS*
[DIMB].[B5].[B5].ALLMEMBERS*
[DIMC].[C1].[C1].ALLMEMBERS*
[DIMD].[D1].[D1].ALLMEMBERS*
[DIMD].[D2].[D2].ALLMEMBERS*
[DIMD].[D3].[D3].ALLMEMBERS*
[Date].[Date].[Date].ALLMEMBERS*
[Date].[Month].[Month].ALLMEMBERS*
} ON ROWS
FROM [Cube]
对于玩时间段来说,这似乎是一个很好的参考: http://www.mssqltips.com/sqlservertip/2877/sql-server-analysis-serviceslead-lag-openingperiod-closingperiod-time-related-functions/
答案 1 :(得分:0)
所以我在Msft论坛上发布了同样的问题并收到了以下答案。它是他们提出的解决性能问题的工作。但是如果有人没有所有的交叉连接来放慢速度,请使用我在问题中列出的三个选项中的一个。
由于 斯
特别感谢WhyTheq耐心并尝试解决问题。感谢你的努力。