MDX 查询 - YTD 由于 where 而产生不正确的结果
MDX query - YTD producing incorrect result due to where
我想 return 多个时期(例如 2012 年 3 月到 2013 年 1 月)的 YTD(即 1 月到当前时期)值。但是可以理解的是,当我应用 where 子句将其限制为 'Mar 2012 to Jan 2013' 时,我们会丢失 YTD 中的一月和二月值。下面是一些示例代码:
WITH
MEMBER [Measures].[Last Day of Month] AS
TAIL(EXISTING [Date].[Date].[Date].MEMBERS).ITEM(0).ITEM(0).MEMBER_CAPTION
MEMBER [Measures].[Calculate YTD] AS
Sum
(
periodstodate(
[Date].[Calendar].[Year],[Date].[Calendar].CurrentMember
)
,[Measures].[Internet Total Sales]
)
SELECT
{
[Measures].[Last Day of Month]
,[Measures].[Internet Total Sales]
,[Measures].[Calculate YTD]
} ON COLUMNS,
[Date].[Calendar].[Month]
ON ROWS
FROM [Adventure Works Internet Sales Model]
WHERE
(
[Date].[Date].&[2012-03-01T00:00:00]:
[Date].[Date].&[2013-01-01T00:00:00]
);
上述 YTD 不正确的查询结果:
3-Mar 3,483.01
4-Apr 3,818.62
5-May ,132,696.51
6-Jun ,687,856.65
7-Jul ,132,414.88
8-Aug ,656,332.26
9-Sep ,142,509.71
10-Oct ,677,669.20
11-Nov ,215,624.71
12-Dec ,840,126.88
1-Jan ,456.25
我想查询 return 的值(正确的 YTD 值):
Calculate YTD
3-Mar ,375,841.32
4-Apr ,776,176.93
5-May ,135,054.82
6-Jun ,690,214.97
7-Jul ,134,773.20
8-Aug ,658,690.58
9-Sep ,144,868.03
10-Oct ,680,027.51
11-Nov ,217,983.03
12-Dec ,842,485.20
1-Jan ,456.25
尝试使用 YTD 函数。不管有没有 where 子句,它都会给你正确的结果。
(AdventureWorks 2014,互联网销售额度量 YTD)
WITH
MEMBER [Measures].[Calculate YTD] AS
AGGREGATE(YTD(), [Measures].[Internet Sales Amount])
SELECT
{
[Measures].[Internet Sales Amount]
,[Measures].[Calculate YTD]
} ON COLUMNS,
[Date].[Calendar].[Month]
ON ROWS
FROM [Adventure Works]
WHERE
(
[Date].[Date].&[20120301]:
[Date].[Date].&[20130101]
);
或使用 PeriodsToDate:
WITH
MEMBER [Measures].[Calculate YTD] AS
sum
(
periodstodate(
[Date].[Calendar].[Calendar Year],
[Date].[Calendar].currentmember
)
,[Measures].[Internet Sales Amount]
)
SELECT
{
[Measures].[Internet Sales Amount]
,[Measures].[Calculate YTD]
} ON COLUMNS,
[Date].[Calendar].[Month]
ON ROWS
FROM [Adventure Works]
WHERE
(
[Date].[Date].&[20120301]:
[Date].[Date].&[20130101]
);
两个查询 return 相同的结果:
March 2012 ,375,841.32
April 2012 ,776,176.93
May 2012 ,135,054.82
June 2012 ,690,214.97
July 2012 ,134,773.20
August 2012 ,658,690.58
September 2012 ,144,868.03
October 2012 ,680,027.51
November 2012 ,217,983.03
December 2012 ,842,485.20
January 2013 7,689.91
不太确定这些方法中的任何一种是否有效,但无论如何这里...
Sub-select
WITH
MEMBER [Measures].[Last Day of Month] AS
TAIL(EXISTING [Date].[Date].[Date].MEMBERS).ITEM(0).ITEM(0).MEMBER_CAPTION
MEMBER [Measures].[Calculate YTD] AS
Sum
(
periodstodate(
[Date].[Calendar].[Year],[Date].[Calendar].CurrentMember
)
,[Measures].[Internet Total Sales]
)
SELECT
{
[Measures].[Last Day of Month]
,[Measures].[Internet Total Sales]
,[Measures].[Calculate YTD]
} ON COLUMNS,
[Date].[Calendar].[Month]
ON ROWS
FROM
(
SELECT
[Date].[Date].&[2012-03-01T00:00:00]:
[Date].[Date].&[2013-01-01T00:00:00] ON 0
FROM [Adventure Works Internet Sales Model]
);
HAVING
子句:
WITH
MEMBER [Measures].[Last Day of Month VALUE] AS
TAIL(EXISTING [Date].[Date].[Date].MEMBERS).ITEM(0).ITEM(0).MEMBERVALUE
MEMBER [Measures].[Last Day of Month] AS
TAIL(EXISTING [Date].[Date].[Date].MEMBERS).ITEM(0).ITEM(0).MEMBER_CAPTION
MEMBER [Measures].[Calculate YTD] AS
Sum
(
periodstodate(
[Date].[Calendar].[Year],[Date].[Calendar].CurrentMember
)
,[Measures].[Internet Total Sales]
)
SELECT
{
[Measures].[Last Day of Month VALUE]
,[Measures].[Last Day of Month]
,[Measures].[Internet Total Sales]
,[Measures].[Calculate YTD]
} ON COLUMNS,
[Date].[Calendar].[Month]
HAVING
(
[Measures].[Last Day of Month VALUE] >=CDATE('3/1/2012')
AND [Measures].[Last Day of Month VALUE] <=CDATE('1/1/2013')
)
ON ROWS
FROM [Adventure Works Internet Sales Model];
我想 return 多个时期(例如 2012 年 3 月到 2013 年 1 月)的 YTD(即 1 月到当前时期)值。但是可以理解的是,当我应用 where 子句将其限制为 'Mar 2012 to Jan 2013' 时,我们会丢失 YTD 中的一月和二月值。下面是一些示例代码:
WITH
MEMBER [Measures].[Last Day of Month] AS
TAIL(EXISTING [Date].[Date].[Date].MEMBERS).ITEM(0).ITEM(0).MEMBER_CAPTION
MEMBER [Measures].[Calculate YTD] AS
Sum
(
periodstodate(
[Date].[Calendar].[Year],[Date].[Calendar].CurrentMember
)
,[Measures].[Internet Total Sales]
)
SELECT
{
[Measures].[Last Day of Month]
,[Measures].[Internet Total Sales]
,[Measures].[Calculate YTD]
} ON COLUMNS,
[Date].[Calendar].[Month]
ON ROWS
FROM [Adventure Works Internet Sales Model]
WHERE
(
[Date].[Date].&[2012-03-01T00:00:00]:
[Date].[Date].&[2013-01-01T00:00:00]
);
上述 YTD 不正确的查询结果:
3-Mar 3,483.01
4-Apr 3,818.62
5-May ,132,696.51
6-Jun ,687,856.65
7-Jul ,132,414.88
8-Aug ,656,332.26
9-Sep ,142,509.71
10-Oct ,677,669.20
11-Nov ,215,624.71
12-Dec ,840,126.88
1-Jan ,456.25
我想查询 return 的值(正确的 YTD 值):
Calculate YTD
3-Mar ,375,841.32
4-Apr ,776,176.93
5-May ,135,054.82
6-Jun ,690,214.97
7-Jul ,134,773.20
8-Aug ,658,690.58
9-Sep ,144,868.03
10-Oct ,680,027.51
11-Nov ,217,983.03
12-Dec ,842,485.20
1-Jan ,456.25
尝试使用 YTD 函数。不管有没有 where 子句,它都会给你正确的结果。
(AdventureWorks 2014,互联网销售额度量 YTD)
WITH
MEMBER [Measures].[Calculate YTD] AS
AGGREGATE(YTD(), [Measures].[Internet Sales Amount])
SELECT
{
[Measures].[Internet Sales Amount]
,[Measures].[Calculate YTD]
} ON COLUMNS,
[Date].[Calendar].[Month]
ON ROWS
FROM [Adventure Works]
WHERE
(
[Date].[Date].&[20120301]:
[Date].[Date].&[20130101]
);
或使用 PeriodsToDate:
WITH
MEMBER [Measures].[Calculate YTD] AS
sum
(
periodstodate(
[Date].[Calendar].[Calendar Year],
[Date].[Calendar].currentmember
)
,[Measures].[Internet Sales Amount]
)
SELECT
{
[Measures].[Internet Sales Amount]
,[Measures].[Calculate YTD]
} ON COLUMNS,
[Date].[Calendar].[Month]
ON ROWS
FROM [Adventure Works]
WHERE
(
[Date].[Date].&[20120301]:
[Date].[Date].&[20130101]
);
两个查询 return 相同的结果:
March 2012 ,375,841.32
April 2012 ,776,176.93
May 2012 ,135,054.82
June 2012 ,690,214.97
July 2012 ,134,773.20
August 2012 ,658,690.58
September 2012 ,144,868.03
October 2012 ,680,027.51
November 2012 ,217,983.03
December 2012 ,842,485.20
January 2013 7,689.91
不太确定这些方法中的任何一种是否有效,但无论如何这里...
Sub-select
WITH
MEMBER [Measures].[Last Day of Month] AS
TAIL(EXISTING [Date].[Date].[Date].MEMBERS).ITEM(0).ITEM(0).MEMBER_CAPTION
MEMBER [Measures].[Calculate YTD] AS
Sum
(
periodstodate(
[Date].[Calendar].[Year],[Date].[Calendar].CurrentMember
)
,[Measures].[Internet Total Sales]
)
SELECT
{
[Measures].[Last Day of Month]
,[Measures].[Internet Total Sales]
,[Measures].[Calculate YTD]
} ON COLUMNS,
[Date].[Calendar].[Month]
ON ROWS
FROM
(
SELECT
[Date].[Date].&[2012-03-01T00:00:00]:
[Date].[Date].&[2013-01-01T00:00:00] ON 0
FROM [Adventure Works Internet Sales Model]
);
HAVING
子句:
WITH
MEMBER [Measures].[Last Day of Month VALUE] AS
TAIL(EXISTING [Date].[Date].[Date].MEMBERS).ITEM(0).ITEM(0).MEMBERVALUE
MEMBER [Measures].[Last Day of Month] AS
TAIL(EXISTING [Date].[Date].[Date].MEMBERS).ITEM(0).ITEM(0).MEMBER_CAPTION
MEMBER [Measures].[Calculate YTD] AS
Sum
(
periodstodate(
[Date].[Calendar].[Year],[Date].[Calendar].CurrentMember
)
,[Measures].[Internet Total Sales]
)
SELECT
{
[Measures].[Last Day of Month VALUE]
,[Measures].[Last Day of Month]
,[Measures].[Internet Total Sales]
,[Measures].[Calculate YTD]
} ON COLUMNS,
[Date].[Calendar].[Month]
HAVING
(
[Measures].[Last Day of Month VALUE] >=CDATE('3/1/2012')
AND [Measures].[Last Day of Month VALUE] <=CDATE('1/1/2013')
)
ON ROWS
FROM [Adventure Works Internet Sales Model];