Ssas 按日期维度筛选的MDX查询

Ssas 按日期维度筛选的MDX查询,ssas,mdx,cube,Ssas,Mdx,Cube,我不熟悉MDX查询,正在尝试找出如何使用日期维度过滤结果集 让我们以这样的立方体结构为例(人为的例子): 我想给用户一个要选择的项目列表,并显示所选项目期间发生的所有事件的成本(即开始日期和结束日期之间)。但是,这些事件与项目没有关联 使用查询: SELECT NON EMPTY { [Measures].[Cost] } ON COLUMNS, NON EMPTY { ( [Project Details].[Project].[Project].ALLMEM

我不熟悉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
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]
如果仅对项目1运行查询,则应排除第一个事件和最后两个事件

最好的方法是使用WHERE或过滤器吗?由于这些都是维度而不是度量,我如何比较[Start Date]和[End Date]之间的[code>位置[发生日期]


非常感谢您的帮助。

我想尝试以下方法:

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
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]
成员[Measures].[Cost in period]为
IIF(
[事件详细信息][发生日期].CurrentMember.Properties('Key')>=
[项目详细信息][开始日期].CurrentMember.Properties('键')&&

[事件详细信息].[发生日期].CurrentMember.Properties('Key')如果
[事件详细信息]
[项目详细信息]
是,您可以使用
LINKMEMBER
MDX函数来帮助您。此外,我假设您将使用某种前端(可能是SRS)允许用户自由选择开始和结束日期(作为参数或日历控件)。在这种情况下,用户将以字符串形式输入MDX查询。
strotmember
函数将这些字符串转换为成员

使用
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
免责声明:如前所述,只有当
[事件详细信息]
[项目详细信息]
是角色扮演维度时,它才有效


我不确定此代码是否适用于您的场景,但我发现此函数有时非常方便。要阅读有关
LINKMEMBER
函数的更多信息,请参阅。

未测试。我以前没有使用过&&可能只是关键字,就足够了:

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]
选择非空
{
[措施][费用]
}
在专栏上,
非空
{
(
[项目详细信息].[项目].[项目].所有成员
*[项目详细信息][开始日期][开始日期].所有成员
*[项目详细信息][结束日期][结束日期].所有成员
*[事件详细信息][发生日期][发生日期].所有成员
)
}
具有[事件详细信息][发生日期].CurrentMember.MEMBERVALUE>=
[项目详细信息][开始日期].CurrentMember.MEMBERVALUE

&&//您是否考虑过在ETL中解决此问题?在“事件详细信息”中添加新属性应该很容易-维度,以指示事件是否发生在相应项目的开始日期和结束日期之间。然后使用此新属性筛选超出此时间间隔的事件。很遗憾,我正在处理第三方多维数据集,无法修改它:(虽然它并没有提供我所期望的结果——包含日期和值的行,而不是上面过滤的行。但你是对的——is运行速度非常慢。谢谢你的帮助。我已经用一个解决方案彻底修改了我的答案,我认为这个解决方案应该有效(而且性能也更好)。请尝试新的解决方案,并让我知道它是如何进行的。非常感谢可能的解决方案。不幸的是,多维数据集不是我可以修改的,我只有对它们的读取权限!在我制作自己的多维数据集时,请记住这一点!