按日期维度筛选的 MDX 查询
MDX Query to Filter by Date Dimensions
我是 MDX 查询的新手,正在尝试了解如何使用日期维度过滤结果集。
让我们来看一个像这样构造的立方体(人为的例子):
我想向用户提供 select 的项目列表,并显示 selected 项目期间发生的所有事件的成本(即开始日期和结束日期之间) .但是,这些事件没有链接到项目。
使用查询:
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。感谢NON EMPTY
on Row members,应该从结果中过滤掉数据。
如果[Event Details]
和[Project Details]
是role playing dimensions,你可以使用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
函数的更多信息,请参阅 here。
未测试。我之前没有使用过 && - 也许只是关键字 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]
我是 MDX 查询的新手,正在尝试了解如何使用日期维度过滤结果集。
让我们来看一个像这样构造的立方体(人为的例子):
我想向用户提供 select 的项目列表,并显示 selected 项目期间发生的所有事件的成本(即开始日期和结束日期之间) .但是,这些事件没有链接到项目。
使用查询:
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。感谢NON EMPTY
on Row members,应该从结果中过滤掉数据。
如果[Event Details]
和[Project Details]
是role playing dimensions,你可以使用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
函数的更多信息,请参阅 here。
未测试。我之前没有使用过 && - 也许只是关键字 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]