Report Builder 3.0 - MDX - 移动总和

时间:2017-03-23 20:59:42

标签: reporting-services ssas mdx ssrs-2008-r2 moving-average

我已经倾倒了很多网站,包括这个网站,到目前为止都是徒劳的。我需要创建一个描绘员工流动率的图表,该流程率必须计算超过1年。 (如我的标题所述,我可以选择13个周期或12个月:两个都相当于1年。)请参阅我的数据集的以下“示例版本”:

Year  |  Trimester  |  Period  | Date End of Period | Departures  |  Avg total Employees
2015         1          1        yyyy-mm-dd 00:00:00      2           100
2015         1          2        yyyy-mm-dd 00:00:00      3           99
2015         1          3        yyyy-mm-dd 00:00:00      4           98
2015         2          4        yyyy-mm-dd 00:00:00      0           102
2015         2          5        yyyy-mm-dd 00:00:00      1           100
2015         2          6        yyyy-mm-dd 00:00:00      0           98
2015         3          7        yyyy-mm-dd 00:00:00      4           99
2015         3          8        yyyy-mm-dd 00:00:00      3           96
2015         3          9        yyyy-mm-dd 00:00:00      4           100
2015         3          10       yyyy-mm-dd 00:00:00      0           98
2015         4          11       yyyy-mm-dd 00:00:00      0           97
2015         4          12       yyyy-mm-dd 00:00:00      2           99
2015         4          13       yyyy-mm-dd 00:00:00      3           98
2016         1          1        yyyy-mm-dd 00:00:00      2           100
2016         1          2        yyyy-mm-dd 00:00:00      4           97
2016       [...]

FYI 平均员工总数=([员工总数]。[期末] + [员工总数]。[期初])/ 2

以下是我的图表目前的样子(道歉,标签是法语)

enter image description here

价值:离职/平均员工总数 顺便说一句,正如您可以注意到的那样,橙色是尝试通过转到添加计算系列计算系列属性选择移动平均线来获得所需结果:尝试失败了。

所以这是我的问题:我想要的只是1个系列,显示每个时段的12个月累积值。也就是说,请参阅以下基于我的数据集的示例:

2016年的当前,第1期 = 2/100 = 2%

2016年的结果,期间1 =(2 + 3 + 2 + 0 + 0 + 4 + 3 + 4 + 0 + 1 + 0 + 4 + 3)/((100 +100)/ 2)= 26%,即添加过去13个期间的离职并对平均员工人数进行比率:(2016P01 + 2015P13 + 2015P12 + [...] + 2015P03 + 2015P02)

所以,换句话说,我需要获得一个图表,其中每个时期显示的营业额值将是一个百分比,肯定会在20-30%左右,而不是当前的0-4%(基于我的数据集值) 。)有什么想法吗?

感谢所有人!

EDIT1 我发现通过使用RunningValue函数: =RunningValue(Fields!Turnover.Value, Sum, Nothing)它提供了一些接近我想要的东西,但仍然不是。我基本上需要一个“Runningtotal”,其范围为最后13个句点...如果存在= /

P.S。 Fields!Turnover.Value = Fields!Departure.Value / Fields!Avg_total_Employees.Value

EDIT2 首先,谢谢Alan。 gowww,这是我的实际DS的截图示例: enter image description here

注意:我输入的那个和这个之间的细微差别是我需要提供营业额Tx1(包括所有员工)和营业额Tx2(不包括退休)。因此,我创建了以下计算成员(屏幕截图的左下角)并从我的DS中删除了[平均员工总数]和[离职],因为我的Tx1和Tx2占了两者:

退休人员人数:Départs_ret = ([Measures].[Nb Départs],[Départ].[Départ].&[112337])

营业额1:Tx1 = ([Measures].[Nb Départs])/([Measures].[Nb Matricules Actifs (Moyen)])

营业额2:Tx2 = (([Measures].[Nb Départs])-([Measures].[Départs_ret]))/([Measures].[Nb Matricules Actifs (Moyen)]))])

我的MDX查询以文本形式显示如下:

WITH MEMBER [Measures].[Départs_ret] AS ([Measures].[Nb Départs],[Départ].[Départ].&[112337]) 
MEMBER [Measures].[Tx1] AS ([Measures].[Nb Départs])/([Measures].[Nb Matricules Actifs (Moyen)]) 
MEMBER [Measures].[Tx2] AS (([Measures].[Nb Départs])-([Measures].[Départs_ret]))/([Measures].[Nb Matricules Actifs (Moyen)]) 
SELECT NON EMPTY { [Measures].[Tx1], [Measures].[Tx2] } 
ON COLUMNS, NON EMPTY { ([Période Financière].[PF - Année Financière].[PF - Année Financière].ALLMEMBERS * 
[Période Financière].[PF - Trimestre No].[PF - Trimestre No].ALLMEMBERS * 
[Période Financière].[PF - Période Financière No].[PF - Période Financière No].ALLMEMBERS * 
[Période Financière].[PF - Date Fin Période].[PF - Date Fin Période].ALLMEMBERS ) } 
DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM ( SELECT ( -{ [Période Financière].[PF - Année Financière - Trimestre].[PF - Année Financière].&[2014], [Période Financière].[PF - Année Financière - Trimestre].[PF - Année Financière].&[2013], [Période Financière].[PF - Année Financière - Trimestre].[PF - Année Financière].&[2012] } ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@[PériodeFinancièrePFAnnéeFinancière], CONSTRAINED) ) 
ON COLUMNS FROM [Historique Employés PerFin])) 
CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS

如果我对代码的分割不正确,我很抱歉,我试图让SSRS简单地将它作为一个大模糊来实现它。

谢谢!

3 个答案:

答案 0 :(得分:0)

Report Builder不是一个很好的工具来进行相对运行的聚合。我的解决方案是基于SQL的。我不知道您的数据结构,所以我无法给您写一个查询,但我会给出一个高级别的解释。你要做的是以13周期偏移作为条件将表连接到自身。然后,您将能够从该子查询获得导致每个时段的总离场。这样,您只需在报告中进行相对简单的计算。

答案 1 :(得分:0)

我同意@StevenWhite的说法,在数据集中执行此类操作有时会更简单。我在这里用SQL Fiddle设置了一个示例

http://sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/9722

代码如下: 在2016年期间,它的结果约为26-27%。基本计算是过去12个期间“离职”的总和除以“平均总雇员人数”的平均值。在此示例中,它也包括当前时段,但您可以通过编辑查询末尾附近的BETWEEN子句轻松调整范围。

DECLARE @data TABLE ([Year] int, [Period] int, Departures float, [Avg Total Employees] float)

INSERT INTO @data
VALUES
(2015, 1, 2, 100),
(2015, 2, 3, 99),
(2015, 3, 4, 98),
(2015, 4, 0, 102),
(2015, 5, 1, 100),
(2015, 6, 0, 98),
(2015, 7, 4, 99),
(2015, 8, 3, 96),
(2015, 9, 4, 100),
(2015, 10, 0, 98),
(2015, 11, 0, 97),
(2015, 12, 2, 99),
(2015, 13, 3, 98),
(2016, 1, 2, 100),
(2016, 2, 4, 97)

-- add a CTE with a row number to help with joining ranges of records
;WITH tmp AS
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY [Year], [Period]) as rn FROM @data
)

SELECT DISTINCT -- DISTINCT because we are not grouping, instead using windowed functions
        a.[Year], a.[Period]
        , CAST(SUM(b.Departures) OVER(PARTITION BY a.[Year], a.[Period]) / AVG(b.[Avg Total Employees]) OVER(PARTITION BY a.[Year], a.[Period]) as float) AS TurnOverRate
    FROM tmp a
        JOIN tmp b on a.rn - b.rn between 0 and 12 -- raneg of periods to be included
order by a.[Year], a.[Period]

答案 2 :(得分:0)

在倾倒MDX之后,我找到了解决方案。实际上,它必须在查询设计器中的文本模式下完成,您必须使用Lag()函数。所以,这就是我的DS现在的样子:

WITH 
MEMBER [Measures].[Total_déb] 
AS ([PF - Date Fin Période].CurrentMember.Lag(12), [Measures].[Nb Matricules Actifs (DtDeb)])
MEMBER [Measures].[Départ_YTD]
AS 'SUM(
{[PF - Date Fin Période].CurrentMember.Lag(12):[PF - Date Fin Période].CurrentMember}, [Measures].[Nb Départs])'
MEMBER [Measures].[Départ_ret_YTD]
AS 'SUM(
{[PF - Date Fin Période].CurrentMember.Lag(12):[PF - Date Fin Période].CurrentMember}, ([Measures].[Nb Départs],[Départ].[Départ].&[112337]))'
SELECT NON EMPTY { [Measures].[Total_déb], [Measures].[Départ_YTD], [Measures].[Départ_ret_YTD], [Measures].[Nb Total Employés Actifs (DtFin)] } ON COLUMNS, NON EMPTY 
{ ([Période Financière].[PF - Année Financière].[PF - Année Financière].ALLMEMBERS * [Période Financière].[PF - Trimestre No].[PF - Trimestre No].ALLMEMBERS * [Période Financière].[PF - Période Financière No].[PF - Période Financière No].ALLMEMBERS * [Période Financière].[PF - Date Fin Période].[PF - Date Fin Période].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS 
FROM ( SELECT ( -{ [Période Financière].[PF - Année Financière - Trimestre].[PF - Année Financière].&[2014], [Période Financière].[PF - Année Financière - Trimestre].[PF - Année Financière].&[2013], [Période Financière].[PF - Année Financière - Trimestre].[PF - Année Financière].&[2012] } ) ON COLUMNS 
FROM ( SELECT ( STRTOSET(@[PériodeFinancièrePFAnnéeFinancière], CONSTRAINED) ) ON COLUMNS FROM [Historique Employés PerFin])) 
CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS

现在这是我的DS的屏幕截图: enter image description here