Report Builder 3.0 - MDX - 移动总和
Report Builder 3.0 - MDX - Moving Sum
我浏览了很多网站,包括这个网站,但到目前为止都是徒劳的。我需要创建一个图表来描述必须在 1 年内计算的员工离职率。 (如我的标题所述,我可以选择 13 个周期或 12 个月:两者都相当于 1 年。)请查看我的数据集的以下 "sample version":
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 [...]
仅供参考 平均员工总数 = ([员工总数].[期末] + [员工总数].[期初])/2
这是我的图表目前的样子(抱歉,标签是法语的):
值:离职人数/平均员工总数
顺便说一句,正如您肯定注意到的那样,橙色是通过转到 添加计算系列 和 计算系列属性 来获得所需结果的尝试选择移动平均线:尝试失败。
所以这是我的问题:我想要的是 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)
它提供的东西接近我想要的,但还不完全是。我基本上需要一个范围为最后 13 个周期的 "Runningtotal"... 如果存在的话 =/
p.s。 Fields!Turnover.Value = Fields!Departure.Value / Fields!Avg_total_Employees.Value
EDIT2
首先,谢谢艾伦。继续前进,这是我实际 DS 的屏幕截图示例:
注意:我打的和这个略有不同的是,我需要提供一个营业额Tx1(包括所有员工)和一个营业额Tx2(包括所有员工)退休除外)。因此,我创建了以下计算成员(屏幕截图的左下角)并从我的 DS 中删除了 [Avg total employees] 和 [Departures],因为我的 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 只是把它当作一个大问题。
谢谢!
Report Builder 不是进行相对 运行 聚合的好工具。我的解决方案是基于 SQL。我不知道你的数据结构,所以我不能给你写一个查询,但我会给出一个高层次的解释。您要做的是将 table 加入到自身中,并以 13 个周期偏移量作为条件。然后,您将能够从该子查询中获得每个时期之前的总出发时间。这样你就只需要在报表中做比较简单的计算。
我同意@StevenWhite 的观点,有时在您的数据集中执行此类操作会更简单。我在 SQL Fiddle 此处
中设置了示例
http://sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/9722
代码如下:
对于 2016 年期间,它给出的结果约为 26-27%。基本计算是最后 12 个周期的总和 'Departures' 除以 'Avg Total Employees' 的平均值。在此示例中,它也包括当前期间,但您可以通过编辑查询末尾附近的 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]
在倾注了 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 的屏幕截图:
我浏览了很多网站,包括这个网站,但到目前为止都是徒劳的。我需要创建一个图表来描述必须在 1 年内计算的员工离职率。 (如我的标题所述,我可以选择 13 个周期或 12 个月:两者都相当于 1 年。)请查看我的数据集的以下 "sample version":
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 [...]
仅供参考 平均员工总数 = ([员工总数].[期末] + [员工总数].[期初])/2
这是我的图表目前的样子(抱歉,标签是法语的):
值:离职人数/平均员工总数 顺便说一句,正如您肯定注意到的那样,橙色是通过转到 添加计算系列 和 计算系列属性 来获得所需结果的尝试选择移动平均线:尝试失败。
所以这是我的问题:我想要的是 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)
它提供的东西接近我想要的,但还不完全是。我基本上需要一个范围为最后 13 个周期的 "Runningtotal"... 如果存在的话 =/
p.s。 Fields!Turnover.Value = Fields!Departure.Value / Fields!Avg_total_Employees.Value
EDIT2
首先,谢谢艾伦。继续前进,这是我实际 DS 的屏幕截图示例:
注意:我打的和这个略有不同的是,我需要提供一个营业额Tx1(包括所有员工)和一个营业额Tx2(包括所有员工)退休除外)。因此,我创建了以下计算成员(屏幕截图的左下角)并从我的 DS 中删除了 [Avg total employees] 和 [Departures],因为我的 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 只是把它当作一个大问题。
谢谢!
Report Builder 不是进行相对 运行 聚合的好工具。我的解决方案是基于 SQL。我不知道你的数据结构,所以我不能给你写一个查询,但我会给出一个高层次的解释。您要做的是将 table 加入到自身中,并以 13 个周期偏移量作为条件。然后,您将能够从该子查询中获得每个时期之前的总出发时间。这样你就只需要在报表中做比较简单的计算。
我同意@StevenWhite 的观点,有时在您的数据集中执行此类操作会更简单。我在 SQL Fiddle 此处
中设置了示例http://sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/9722
代码如下: 对于 2016 年期间,它给出的结果约为 26-27%。基本计算是最后 12 个周期的总和 'Departures' 除以 'Avg Total Employees' 的平均值。在此示例中,它也包括当前期间,但您可以通过编辑查询末尾附近的 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]
在倾注了 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 的屏幕截图: