繁体   English   中英

通过日期维度过滤的MDX查询

[英]MDX Query to Filter by Date Dimensions

我是MDX查询的新手,正在尝试弄清楚如何使用日期维度过滤结果集。

让我们来看一个结构如下的立方体(人为的例子):

立方体结构

我想给用户一个可供选择的项目列表,并显示在所选项目期间(即,开始日期和结束日期之间)发生的所有事件的成本。 但是,事件未链接到项目。

使用查询:

SELECT NON EMPTY
{
    [Measures].[Cost]
}
ON COLUMNS,
NON EMPTY
{
    (
        [Project Details].[Project].[Project].ALLMEMBERS
        * [Project Details].[Start Date].[Start Date].ALLMEMBERS
        * [Project Details].[End Date].[End Date].ALLMEMBERS
        * [Event Details].[Date of Occurrence].[Date of Occurrence].ALLMEMBERS
    )
}
DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME
ON ROWS
FROM [Cube]
CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS

我可以得到像这样的物品清单:

Project    Start Date    End Date    Date of Occurrence    Cost
------------------------------------------------------------------
Project 1  01-Jan-15     31-Jan-15   27-Dec-14             750
Project 1  01-Jan-15     31-Jan-15   01-Jan-15             680
Project 1  01-Jan-15     31-Jan-15   02-Jan-15             320
Project 1  01-Jan-15     31-Jan-15   03-Jan-15             150
Project 1  01-Jan-15     31-Jan-15   01-Feb-15             700
Project 1  01-Jan-15     31-Jan-15   05-Feb-15             175

如果仅对项目1运行查询,则应排除第一个事件和最后两个事件。

最好的方法是使用WHERE还是FILTER? 并且由于这些是尺寸而非度量,我将如何比较WHERE [Date of Occurrence] BETWEEN [Start Date] AND [End Date]

任何帮助深表感谢。

我会尝试这样的事情:

WITH MEMBER [Measures].[Cost in period] AS 
    IIF(
        [Event Details].[Date of Occurrence].CurrentMember.Properties('Key') >= 
          [Project Details].[Start Date].CurrentMember.Properties('Key') &&
        [Event Details].[Date of Occurrence].CurrentMember.Properties('Key') <= 
          [Project Details].[End Date].CurrentMember.Properties('Key'),
    [Measures].[Cost], NULL)
SELECT NON EMPTY
{
    [Measures].[Cost in period]
}
ON COLUMNS,
NON EMPTY
{
    (
        [Project Details].[Project].[Project].ALLMEMBERS
        * [Project Details].[Start Date].[Start Date].ALLMEMBERS
        * [Project Details].[End Date].[End Date].ALLMEMBERS
        * [Event Details].[Date of Occurrence].[Date of Occurrence].ALLMEMBERS
    )
}
ON ROWS
FROM [Cube]

基本上,当发生日期位于“开始日期-结束日期”间隔之外时,您将创建一个计算量度,该值为NULL。 由于Row成员上的NON EMPTY ,数据应从结果中过滤掉。

如果[Event Details][Project Details]角色扮演维度 ,则可以放置LINKMEMBER MDX函数来帮助您。 另外,我假设您将使用某种前端(也许是SSRS)来使用户自由选择开始日期和结束日期(作为参数或日历控件)。 在这种情况下,他们将以字符串形式输入MDX查询。 STRTOMEMBER函数将那些字符串转换为成员。

使用LINKMEMBER ,一旦我生成了一组日期,就使用AGGREGATE函数来获取该组日期的度量值的合计值。

with set [Start Date] as
linkmember(STRTOMEMBER('[Project Details].[Start Date].[Start Date].&[01/01/2014]'), [Event Details].[Date of Occurrence])

set [End Date] as 
linkmember(STRTOMEMBER('[Project Details].[End Date].[End Date].&[01/01/2015]'), [Event Details].[Date of Occurrence])

set ListOfDate as
{[Start Date].item(0):[End Date].item(0)}


member [Measure.NetCost] as
aggregate(ListOfDates, [Measures].[Cost])

SELECT NON EMPTY
{
    [Measure.NetCost]
}
ON COLUMNS,
NON EMPTY [Project Details].[Project].[Project].ALLMEMBERS  

DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME
ON ROWS
FROM [Cube]
CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS

免责声明:如前所述,仅当[Event Details][Project Details]是角色扮演维度时,它才有效。

我不确定该代码是否可以在您的情况下使用,但是我有时发现此功能非常方便。 要了解有关LINKMEMBER功能的更多信息,请参见此处

未经测试。 我以前没有使用&&-也许只是关键字AND就足够了:

SELECT NON EMPTY
{
    [Measures].[Cost]
}
ON COLUMNS,
NON EMPTY
{
    (
        [Project Details].[Project].[Project].ALLMEMBERS
        * [Project Details].[Start Date].[Start Date].ALLMEMBERS
        * [Project Details].[End Date].[End Date].ALLMEMBERS
        * [Event Details].[Date of Occurrence].[Date of Occurrence].ALLMEMBERS
    )
}
HAVING [Event Details].[Date of Occurrence].CurrentMember.MEMBERVALUE >= 
          [Project Details].[Start Date].CurrentMember.MEMBERVALUE 
        && //<< OR IS THIS JUST "AND"?
        [Event Details].[Date of Occurrence].CurrentMember.MEMBERVALUE <= 
          [Project Details].[End Date].CurrentMember.MEMBERVALUE
ON ROWS
FROM [Cube]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM