我如何使用DAX函数ParallelPeriod

ParaellePeriod函数允许比较不同时间点的价值(销售额与一年前相比)。 我在使用它的时候做错了什么,但是不知道可能是什么。

build立

我创build了一个简单的PowerPivot SQL Server 2008+源查询,并将其命名为Source。 查询生成168行:6个ID(100-600)和28个date(2010年1月至2012年4月的第一个月)全部交叉应用。

; WITH SRC (groupKey, eventDate, value) AS ( SELECT G.groupKey, D.eventDate, CAST(rand(G.groupKey * year(D.eventDate) * month(D.eventDate)) * 100 AS int) FROM ( SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300 UNION ALL SELECT 400 UNION ALL SELECT 500 UNION ALL SELECT 600 ) G (groupKey) CROSS APPLY ( SELECT CAST('2010-01-01' AS date) UNION ALL SELECT CAST('2010-02-01' AS date) UNION ALL SELECT CAST('2010-03-01' AS date) UNION ALL SELECT CAST('2010-04-01' AS date) UNION ALL SELECT CAST('2010-05-01' AS date) UNION ALL SELECT CAST('2010-06-01' AS date) UNION ALL SELECT CAST('2010-07-01' AS date) UNION ALL SELECT CAST('2010-08-01' AS date) UNION ALL SELECT CAST('2010-09-01' AS date) UNION ALL SELECT CAST('2010-10-01' AS date) UNION ALL SELECT CAST('2010-11-01' AS date) UNION ALL SELECT CAST('2010-12-01' AS date) UNION ALL SELECT CAST('2011-01-01' AS date) UNION ALL SELECT CAST('2011-02-01' AS date) UNION ALL SELECT CAST('2011-03-01' AS date) UNION ALL SELECT CAST('2011-04-01' AS date) UNION ALL SELECT CAST('2011-05-01' AS date) UNION ALL SELECT CAST('2011-06-01' AS date) UNION ALL SELECT CAST('2011-07-01' AS date) UNION ALL SELECT CAST('2011-08-01' AS date) UNION ALL SELECT CAST('2011-09-01' AS date) UNION ALL SELECT CAST('2011-10-01' AS date) UNION ALL SELECT CAST('2011-11-01' AS date) UNION ALL SELECT CAST('2011-12-01' AS date) UNION ALL SELECT CAST('2012-01-01' AS date) UNION ALL SELECT CAST('2012-02-01' AS date) UNION ALL SELECT CAST('2012-03-01' AS date) UNION ALL SELECT CAST('2012-04-01' AS date) ) D (eventDate) ) SELECT * FROM SRC; 

我使用从MSDN解除的公式在PowerPivot中添加了派生列

 =CALCULATE(SUM(Source[value]), PARALLELPERIOD(Source[eventDate], -1, year)) 

没有显示错误,但没有任何计算的数据。 我尝试了不同的时间间隔(-1,+ 1)和时间段(年,月),但无济于事。

我可以观察到的唯一不同,我的演示和MSDN是他们有一个单独的维度定义的date。 很容易纠正,所以我创build了以下的date查询。 此查询会为2010-01-01和2012-06-01之间的所有date(1096行)生成一行

 DECLARE @start int = 20100101 , @stop int = 20120601; WITH L0 AS ( SELECT 0 AS C UNION ALL SELECT 0 ) , L1 AS ( SELECT 0 AS c FROM L0 AS A CROSS JOIN L0 AS B ) , L2 AS ( SELECT 0 AS c FROM L1 AS A CROSS JOIN L1 AS B ) , L3 AS ( SELECT 0 AS c FROM L2 AS A CROSS JOIN L2 AS B ) , L4 AS ( SELECT 0 AS c FROM L3 AS A CROSS JOIN L3 AS B ) , L5 AS ( SELECT 0 AS c FROM L4 AS A CROSS JOIN L4 AS B ) , NUMS AS ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS number FROM L5 ) , YEARS AS ( SELECT Y.number FROM NUMS Y WHERE Y.number BETWEEN @start / 10000 AND @stop / 10000 ) , MONTHS AS ( SELECT Y.number FROM NUMS Y WHERE Y.number BETWEEN 1 and 12 ) , DAYS AS ( SELECT Y.number FROM NUMS Y WHERE Y.number BETWEEN 1 and 31 ) , CANDIDATES_0 AS ( SELECT Y.number * 10000 + M.number * 100 + D.number AS SurrogateKey , CAST(Y.number * 10000 + M.number * 100 + D.number AS char(8)) AS DateValue FROM YEARS Y CROSS APPLY MONTHS M CROSS APPLY DAYS D ) , HC AS ( SELECT Y.number * 10000 + M.number * 100 + D.number AS SurrogateKey , CAST(Y.number * 10000 + M.number * 100 + D.number AS char(8)) AS DateValue FROM YEARS Y CROSS APPLY MONTHS M CROSS APPLY DAYS D WHERE D.number < 31 AND M.number IN (4,6,9,11) UNION ALL SELECT Y.number * 10000 + M.number * 100 + D.number AS SurrogateKey , CAST(Y.number * 10000 + M.number * 100 + D.number AS char(8)) AS DateValue FROM YEARS Y CROSS APPLY MONTHS M CROSS APPLY DAYS D WHERE D.number < 32 AND M.number IN (1,3,5,7,8,10,12) UNION ALL SELECT Y.number * 10000 + M.number * 100 + D.number AS SurrogateKey , CAST(Y.number * 10000 + M.number * 100 + D.number AS char(8)) AS DateValue FROM YEARS Y CROSS APPLY MONTHS M CROSS APPLY DAYS D WHERE D.number < 29 AND M.number = 2 AND ( Y.number % 4 > 0 OR Y.number % 100 = 0 AND Y.number % 400 > 0 ) UNION ALL SELECT Y.number * 10000 + M.number * 100 + D.number AS SurrogateKey , CAST(Y.number * 10000 + M.number * 100 + D.number AS char(8)) AS DateValue FROM YEARS Y CROSS APPLY MONTHS M CROSS APPLY DAYS D WHERE D.number < 30 AND M.number = 2 AND ( Y.number % 4 = 0 OR Y.number % 100 = 0 AND Y.number % 400 = 0 ) ) , CANDIDATES AS ( SELECT C.SurrogateKey , CAST(C.DateValue as date) As DateValue FROM HC C WHERE ISDATE(c.DateValue) = 1 ) , PARTS ( DateKey , FullDateAlternateKey , DayNumberOfWeek , EnglishDayNameOfWeek , DayNumberOfMonth , DayNumberOfYear , WeekNumberOfYear , EnglishMonthName , MonthNumberOfYear , CalendarQuarter , CalendarYear , CalendarSemester --,FiscalQuarter --,FiscalYear --,FiscalSemester ) AS ( SELECT CAST(C.SurrogateKey AS int) , C.DateValue , DATEPART(WEEKDAY, C.DateValue) , DATENAME(WEEKDAY, C.DateValue) , DATEPART(DAY, C.DateValue) , DATEPART(DAYOFYEAR, C.DateValue) , DATEPART(WEEK, C.DateValue) , DATENAME(MONTH, C.DateValue) , DATEPART(MONTH, C.DateValue) , DATEPART(QUARTER, C.DateValue) , DATEPART(YEAR, C.DateValue) , DATEPART(WEEK, C.DateValue) FROM CANDIDATES C WHERE C.DateValue IS NOT NULL ) SELECT P.* FROM --HC P PARTS P ORDER BY 1; 

通过生成的数据,我创build了源和date之间的关系,并尝试这个公式也没有运气

 =CALCULATE(SUM(Source[value]), PARALLELPERIOD(Dates[FullDateAlternateKey], -1, year)) 

PowerPivotdevise器看起来像

PowerPivot视图

任何想法,我在做什么错了?

参考

  • PARALLELPERIOD函数
  • PowerPivot DAX PARALLELPERIOD与DATEADD

您在派生列中使用的DAXexpression式应该是一个度量,并在计算区域中定义…

 MeasurePriorPeriodValue := CALCULATE(SUM(Source[value]), PARALLELPERIOD(Source[eventDate], -1, year)) 

…只要您在parallelperiod函数中使用的列被configuration为date数据types,它仍然可以工作。 将date表与其余部分分开是“最佳实践”,但不是必需的,因为它允许您确保没有差距(这可能会导致某些DAX时间智能function出现问题)等等。