上一年的OLAP多维数据集计算(星期日比较)-MDX
我想将实际销售额与去年的销售额进行比较。这种比较的困难在于周日的一致性,因此也就是闰年的一致性 日级示例: 2016-02-04(星期四):实际销售额:580,-去年销售额:1.008- 比较 2015-02-05(星期四):实际销售额:1.008- 因此,我想比较一个月中相同的星期天,而不仅仅是相同的日期 月级示例: 2016年:(闰年) 2016年2月1日-2019年2月29日(2016年2月)实际销售额:19.300,-:去年销售额:19.000- 比较 2015年:(无闰年) 2015年2月2日-2015年3月2日(2015年2月1日)实际销售额:19.000- 我不仅要将2016年2月与2015年2月进行比较,更要准确地比较一周内销售值的总和 我尝试使用日期计算维度编写此计算,但它只能在日级别上工作。计算维度名称:日期计算周日期成员名称:ComparisonWWD上一年的OLAP多维数据集计算(星期日比较)-MDX,mdx,olap,olap-cube,calculation,mdx-query,Mdx,Olap,Olap Cube,Calculation,Mdx Query,我想将实际销售额与去年的销售额进行比较。这种比较的困难在于周日的一致性,因此也就是闰年的一致性 日级示例: 2016-02-04(星期四):实际销售额:580,-去年销售额:1.008- 比较 2015-02-05(星期四):实际销售额:1.008- 因此,我想比较一个月中相同的星期天,而不仅仅是相同的日期 月级示例: 2016年:(闰年) 2016年2月1日-2019年2月29日(2016年2月)实际销售额:19.300,-:去年销售额:19.000- 比较 2015年:(无闰年) 2015年
SCOPE (
[Date].[Year - Quarter - Month - Date].MEMBERS,
[Date].[Date].MEMBERS );
( [Date Calculations Week Day].[ComparisonWD].[Previous Year],
[Date Calculations Week Day].[AggregationWD].Members )
= ( [Date Calculations Week Day].[ComparisonWD].DefaultMember,
ParallelPeriod( [Date].[Year - Quarter - Month - Date].[Date],
364,
[Date].[Year - Quarter - Month - Date].CurrentMember ) );
END SCOPE;
2015年结果:
2016年结果:
它在日级别工作,但正如您在月级别和年级别上所看到的那样
我怎样才能做到这一点呢?并没有准确回答这个问题,但在以下上下文中,
PARALLELPERIOD
似乎非常通用:
一,。
在月份一级:
WITH
MEMBER [Measures].[PY Internet Sales Amount] AS
(
ParallelPeriod
(
[Date].[Calendar].[Calendar Year]
,1
,[Date].[Calendar].CurrentMember
)
,[Measures].[Internet Sales Amount]
)
SELECT
{
[Measures].[Internet Sales Amount]
,[Measures].[PY Internet Sales Amount]
} ON 0
,{
//[Date].[Calendar].[Date].&[20130101]:[Date].[Calendar].[Date].&[20130601]
[Date].[Calendar].[Month].[January 2012]:[Date].[Calendar].[Month].[December 2013]
} ON 1
FROM [Adventure Works];
给出了:
二,。
更改为日期级别,但将并行周期的计算保持不变:
WITH
MEMBER [Measures].[PY Internet Sales Amount] AS
(
ParallelPeriod
(
[Date].[Calendar].[Calendar Year]
,1
,[Date].[Calendar].CurrentMember
)
,[Measures].[Internet Sales Amount]
)
SELECT
{
[Measures].[Internet Sales Amount]
,[Measures].[PY Internet Sales Amount]
} ON 0
,{
[Date].[Calendar].[Date].&[20130101]:[Date].[Calendar].[Date].&[20130601]
//[Date].[Calendar].[Month].[January 2012]:[Date].[Calendar].[Month].[December 2013]
} ON 1
FROM [Adventure Works];
给出以下结果(无空值):
没有准确回答这个问题,但在以下上下文中,
PARALLELPERIOD
似乎非常通用:
一,。
在月份一级:
WITH
MEMBER [Measures].[PY Internet Sales Amount] AS
(
ParallelPeriod
(
[Date].[Calendar].[Calendar Year]
,1
,[Date].[Calendar].CurrentMember
)
,[Measures].[Internet Sales Amount]
)
SELECT
{
[Measures].[Internet Sales Amount]
,[Measures].[PY Internet Sales Amount]
} ON 0
,{
//[Date].[Calendar].[Date].&[20130101]:[Date].[Calendar].[Date].&[20130601]
[Date].[Calendar].[Month].[January 2012]:[Date].[Calendar].[Month].[December 2013]
} ON 1
FROM [Adventure Works];
给出了:
二,。
更改为日期级别,但将并行周期的计算保持不变:
WITH
MEMBER [Measures].[PY Internet Sales Amount] AS
(
ParallelPeriod
(
[Date].[Calendar].[Calendar Year]
,1
,[Date].[Calendar].CurrentMember
)
,[Measures].[Internet Sales Amount]
)
SELECT
{
[Measures].[Internet Sales Amount]
,[Measures].[PY Internet Sales Amount]
} ON 0
,{
[Date].[Calendar].[Date].&[20130101]:[Date].[Calendar].[Date].&[20130601]
//[Date].[Calendar].[Month].[January 2012]:[Date].[Calendar].[Month].[December 2013]
} ON 1
FROM [Adventure Works];
给出以下结果(无空值):
只是尝试将此问题模拟为ssms中的mdx查询,它可以正常工作。我如何应用我的多维数据集计算:
with
set [DateRange] as ( { ParallelPeriod([Date].[Year - Quarter - Month - Date].[Date],
364,
Descendants( [Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date]).item(0)
) :
Parallelperiod ([Date].[Year - Quarter - Month - Date].[Date],
364,
Descendants( [Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date]).item((Descendants(
[Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date])).Count - 1))})
Select {
[Measures].[Turnover]
} on Columns,
non empty
(
[DateRange]
) on Rows
from [Sales Cube]
// ------------------------------------------------------------------------
//
// Comparison Week Day - Date.Calendar
//
// ------------------------------------------------------------------------
SCOPE (
[Date].[Year - Quarter - Month - Date].MEMBERS,
[Date].[Date].MEMBERS );
///////////////////////////////////////////////////////////////////////////////////////
( [Date Calculations Week Day].[ComparisonWD].[Previous Year],
[Date Calculations Week Day].[AggregationWD].Members )
= SUM( [Date Calculations Week Day].[ComparisonWD].DefaultMember,
{ParallelPeriod([Date].[Year - Quarter - Month - Date].[Date], 364, Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date]).item(0)) :
Parallelperiod ([Date].[Year - Quarter - Month - Date].[Date], 364, Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date]).item((Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date])).Count - 1))} );
END SCOPE;
结果如下:
Turnover Net
03.01.2012 642
04.01.2012 665
05.01.2012 633
06.01.2012 730
07.01.2012 761
08.01.2012 531
09.01.2012 422
10.01.2012 488
11.01.2012 518
.
.
.
23.12.2012 618
24.12.2012 174
25.12.2012 137
26.12.2012 536
27.12.2012 981
28.12.2012 1.052
29.12.2012 1.006
30.12.2012 847
31.12.2012 695
01.01.2013 572
你看,日期范围是正确的2012-01-03-2013-01-01
在查询中,我获取日期并将其派生到最低级别(天),然后生成一个日期范围。范围的第一个日期为-364天,范围的最后一个日期为-364天,以获得正确的日期范围。不幸的是,我在多维数据集计算中不起作用:
with
set [DateRange] as ( { ParallelPeriod([Date].[Year - Quarter - Month - Date].[Date],
364,
Descendants( [Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date]).item(0)
) :
Parallelperiod ([Date].[Year - Quarter - Month - Date].[Date],
364,
Descendants( [Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date]).item((Descendants(
[Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date])).Count - 1))})
Select {
[Measures].[Turnover]
} on Columns,
non empty
(
[DateRange]
) on Rows
from [Sales Cube]
// ------------------------------------------------------------------------
//
// Comparison Week Day - Date.Calendar
//
// ------------------------------------------------------------------------
SCOPE (
[Date].[Year - Quarter - Month - Date].MEMBERS,
[Date].[Date].MEMBERS );
///////////////////////////////////////////////////////////////////////////////////////
( [Date Calculations Week Day].[ComparisonWD].[Previous Year],
[Date Calculations Week Day].[AggregationWD].Members )
= SUM( [Date Calculations Week Day].[ComparisonWD].DefaultMember,
{ParallelPeriod([Date].[Year - Quarter - Month - Date].[Date], 364, Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date]).item(0)) :
Parallelperiod ([Date].[Year - Quarter - Month - Date].[Date], 364, Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date]).item((Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date])).Count - 1))} );
END SCOPE;
只是尝试在ssms中将此问题模拟为mdx查询,结果它成功了。我如何应用我的多维数据集计算:
with
set [DateRange] as ( { ParallelPeriod([Date].[Year - Quarter - Month - Date].[Date],
364,
Descendants( [Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date]).item(0)
) :
Parallelperiod ([Date].[Year - Quarter - Month - Date].[Date],
364,
Descendants( [Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date]).item((Descendants(
[Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date])).Count - 1))})
Select {
[Measures].[Turnover]
} on Columns,
non empty
(
[DateRange]
) on Rows
from [Sales Cube]
// ------------------------------------------------------------------------
//
// Comparison Week Day - Date.Calendar
//
// ------------------------------------------------------------------------
SCOPE (
[Date].[Year - Quarter - Month - Date].MEMBERS,
[Date].[Date].MEMBERS );
///////////////////////////////////////////////////////////////////////////////////////
( [Date Calculations Week Day].[ComparisonWD].[Previous Year],
[Date Calculations Week Day].[AggregationWD].Members )
= SUM( [Date Calculations Week Day].[ComparisonWD].DefaultMember,
{ParallelPeriod([Date].[Year - Quarter - Month - Date].[Date], 364, Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date]).item(0)) :
Parallelperiod ([Date].[Year - Quarter - Month - Date].[Date], 364, Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date]).item((Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date])).Count - 1))} );
END SCOPE;
结果如下:
Turnover Net
03.01.2012 642
04.01.2012 665
05.01.2012 633
06.01.2012 730
07.01.2012 761
08.01.2012 531
09.01.2012 422
10.01.2012 488
11.01.2012 518
.
.
.
23.12.2012 618
24.12.2012 174
25.12.2012 137
26.12.2012 536
27.12.2012 981
28.12.2012 1.052
29.12.2012 1.006
30.12.2012 847
31.12.2012 695
01.01.2013 572
你看,日期范围是正确的2012-01-03-2013-01-01
在查询中,我获取日期并将其派生到最低级别(天),然后生成一个日期范围。范围的第一个日期为-364天,范围的最后一个日期为-364天,以获得正确的日期范围。不幸的是,我在多维数据集计算中不起作用:
with
set [DateRange] as ( { ParallelPeriod([Date].[Year - Quarter - Month - Date].[Date],
364,
Descendants( [Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date]).item(0)
) :
Parallelperiod ([Date].[Year - Quarter - Month - Date].[Date],
364,
Descendants( [Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date]).item((Descendants(
[Date].[Year - Quarter - Month - Date].[Year].&[2013] , [Date].[Year - Quarter - Month - Date].[Date])).Count - 1))})
Select {
[Measures].[Turnover]
} on Columns,
non empty
(
[DateRange]
) on Rows
from [Sales Cube]
// ------------------------------------------------------------------------
//
// Comparison Week Day - Date.Calendar
//
// ------------------------------------------------------------------------
SCOPE (
[Date].[Year - Quarter - Month - Date].MEMBERS,
[Date].[Date].MEMBERS );
///////////////////////////////////////////////////////////////////////////////////////
( [Date Calculations Week Day].[ComparisonWD].[Previous Year],
[Date Calculations Week Day].[AggregationWD].Members )
= SUM( [Date Calculations Week Day].[ComparisonWD].DefaultMember,
{ParallelPeriod([Date].[Year - Quarter - Month - Date].[Date], 364, Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date]).item(0)) :
Parallelperiod ([Date].[Year - Quarter - Month - Date].[Date], 364, Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date]).item((Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Date])).Count - 1))} );
END SCOPE;
我得到了解决方案:
此问题的多维数据集计算代码:
// ------------------------------------------------------------------------
//
// Comparison Week Day - Date.Calendar
//
// ------------------------------------------------------------------------
SCOPE (
[Date].[Year - Quarter - Month - Date].MEMBERS,
[Date].[Date].MEMBERS );
///////////////////////////////////////////////////////////////////////////////////////
( [Date Calculations Week Day].[ComparisonWD].[Previous Year],
[Date Calculations Week Day].[AggregationWD].Members )
= SUM({ParallelPeriod([Date].[Year - Quarter - Month - Date].[Date], 364, Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Year - Quarter - Month - Date].[Date]).item(0)) :
Parallelperiod ([Date].[Year - Quarter - Month - Date].[Date], 364, Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Year - Quarter - Month - Date].[Date]).item((Descendants( [Date].[Year - Quarter - Month - Date].CurrentMember , [Date].[Year - Quarter - Month - Date].[Date])).Count - 1))}, [Date Calculations Week Day].[ComparisonWD].DefaultMember );
END SCOPE;
SCOPE ([Date Calculations Week Day].[ComparisonWD].[Diff. Over Previous Year]);
THIS = IIF( IsEmpty( [Date Calculations Week Day].[ComparisonWD].DefaultMember )
OR IsEmpty( [Date Calculations Week Day].[ComparisonWD].[Previous Year] ),
NULL,
[Date Calculations Week Day].[ComparisonWD].DefaultMember
- [Date Calculations Week Day].[ComparisonWD].[Previous Year] );
NON_EMPTY_BEHAVIOR(THIS) = [Date Calculations Week Day].[ComparisonWD].DefaultMember;
FORE_COLOR(THIS) = IIF( [Date Calculations Week Day].[ComparisonWD].[Diff. Over Previous Year] < 0, 255, 0); // 255 = RED
END SCOPE;
SCOPE ([Date Calculations Week Day].[ComparisonWD].[Diff. % Over Previous Year]);
THIS = IIF( IsEmpty( [Date Calculations Week Day].[ComparisonWD].[Diff. Over Previous Year] )
OR IsEmpty( [Date Calculations Week Day].[ComparisonWD].[Previous Year] ),
NULL,
[Date Calculations Week Day].[ComparisonWD].[Diff. Over Previous Year]
/ [Date Calculations Week Day].[ComparisonWD].[Previous Year] );
NON_EMPTY_BEHAVIOR(THIS) = [Date Calculations Week Day].[ComparisonWD].DefaultMember;
FORMAT_STRING(THIS) = 'Percent';
FORE_COLOR(THIS) = IIF( [Date Calculations Week Day].[ComparisonWD].[Diff. % Over Previous Year] < 0, 255, 0); // 255 = RED
END SCOPE;
///////////////
// Tuple (All years, All Months) is the default number (keeps compatibility with OWC11)
( [Date].[Year].[All], [Date].[MonthYear].[All],
Except( [Date Calculations Week Day].[ComparisonWD].[ComparisonWD].MEMBERS, [Date Calculations Week Day].[ComparisonWD].DefaultMember ) ) = [Date Calculations Week Day].[ComparisonWD].DefaultMember;
//------------------------------------------------------------------------
//
//比较周-日-日期.日历
//
// ------------------------------------------------------------------------
范围(
[日期][年-季度-月-日期].成员,
[日期][日期][成员];
///////////////////////////////////////////////////////////////////////////////////////
([Date Calculations Week Day].[ComparisonNWD].[上一年],
[Date Calculations Week Day][AggregationWD]。成员)
=总和({ParallelPeriod([Date].[Year-Quarter-Month-Date].[Date],364,子代([Date].[Year-Quarter-Month-Date]。CurrentMember,[Date].[Year-Quarter-Month-Date].[Date])。项(0)):
Parallelperiod([Date]。[Year-Quarter-Month-Date]。[Date]。[Year-Quarter-Month-Date]。[Date]。[Year-Quarter-Month-Date]。[Date]).item([Date]。[Year-Quarter-Month-Date]。[Date]。[Year-Quarter-Month-Date]。[Date])的后代([Year-Quarter-Month]。[Date]。[Date]。[Year-Quarter-Quarter-Month])。CurrentMember]。[Da。[ComparisonNWD].DefaultMember);
终端范围;
范围([Date Calculations Week Day].[ComparisonWWD].[Diff.超过上一年]);
THIS=IIF(IsEmpty([Date Calculations Week Day].[ComparisonWWD].DefaultMember)
或IsEmpty([日期计算周日][比较NWD][上一年]),
无效的
[Date Calculations Week Day][ComparisonWWD].DefaultMember
-[日期计算周天数][比较NWD][上一年];
非空行为(THIS)=[Date Calculations Week Day].[ComparisonWWD].DefaultMember;
FORE_COLOR(THIS)=IIF([Date Calculations Week Day].[ComparisonNWD].[Diff.Over Year]<0255,0);/255=红色
终端范围;
范围([Date Calculations Week Day].[ComparisonWWD].[Diff.%超过上一年]);
此=IIF(IsEmpty([日期计算周天数][比较NWD][与上一年的差异])
或IsEmpty([日期计算周日][比较NWD][上一年]),
无效的
[日期计算周天数][比较NWD]。[与上一年的差异]
/[日期计算周天数][比较NWD][上一年];
非空行为(THIS)=[Date Calculations Week Day].[ComparisonWWD].DefaultMember;
格式_字符串(THIS)=“百分比”;
FORE_COLOR(THIS)=IIF([Date Calculations Week Day].[comparisonnwd].[Diff.%与上年相比]<0255,0);//255=红色
终端范围;
///////////////
//Tuple(所有年份、所有月份)是默认数字(与OWC11保持兼容)
([日期][年][全部],[日期][月][全部],
除([D]