表达式以找到上一年SSRS的值

时间:2015-04-17 09:03:20

标签: sql-server reporting-services mdx

我需要一些关于表达式的帮助。我需要一份报告,显示当前年份以及前一年关于此规则表达式(上一个上一个上一个)/上一个上一个* 100的字段的计算。报告也在年份参数上运行。 以下是结果的示例
例如,我选择了2010年2011年的2012年

       year
 Data        2010    2011   2012  
 hp          14      25     30    
 Dell        17      18     20 

和我想要的结果

     year
 Data        2010    2011   2012  2011/2012 
 hp          14      25     30       0.002     (Last -Last Previous)/(last Previous*100) =(30-25)/(25*100) 
 Dell        17      18     20       0.0040  

我该怎么做

SELECT 
  NON EMPTY 
    {[Measures].[Val]} ON COLUMNS
 ,NON EMPTY 
    {
      [DimCAT].[lbl].[lbl].ALLMEMBERS * [DimDate].[Year].[Year].ALLMEMBERS
    } ON ROWS
FROM [Data];

2 个答案:

答案 0 :(得分:0)

通过mdx,您需要使用WITH条款 添加的calculated member称为2011/12,但实际上是年度层次结构中与上一年相比的最后一个成员 - 所以可能不完全符合您的要求:

WITH 
  MEMBER [DimDate].[Year].[2011/12] AS 
        (
          Tail([DimDate].[Year].[Year].ALLMEMBERS).Item(0).Item(0)
        - 
          Tail([DimDate].[Year].[Year].ALLMEMBERS).Item(0).Item(0).PrevMember
        )
      / 
        Tail([DimDate].[Year].[Year].ALLMEMBERS).Item(0).Item(0).PrevMember
    * 100 
SELECT 
  NON EMPTY 
    {
      [DimDate].[Year].[Year].ALLMEMBERS
     ,[DimDate].[Year].[2011/12]
    } ON COLUMNS
 ,NON EMPTY 
    {[DimCAT].[lbl].[lbl].ALLMEMBERS} ON ROWS
FROM [Data]
WHERE 
  [Measures].[Val];

使用strToSet函数,您可以使用参数

获取单个成员集
WITH 
  SET [s] AS 
    StrToSet('{[DimDate].[Year].[Year].[' + @Yr + ']}') 
  MEMBER [DimDate].[Year].[LastVsPrev] AS 

        ([s].Item(0).Item(0) - [s].Item(0).Item(0).PrevMember)
      / 
        [s].Item(0).Item(0).PrevMember
    * 100 
SELECT 
  NON EMPTY 
    Union
    (
      {
        [s].Item(0).Item(0).PrevMember.PrevMember : [s].Item(0).Item(0)
      }
     ,{[DimDate].[Year].[LastVsPrev]}
    ) ON COLUMNS
 ,NON EMPTY 
    {[DimCAT].[lbl].[lbl].ALLMEMBERS} ON ROWS
FROM [Data]
WHERE 
  [Measures].[Val]; 

答案 1 :(得分:-1)

如果您有机会更改源数据集,我会将年份为UNPIVOTed的数据集和带有Row_Number的数据集按年份降序排列。这样你可以过滤你想要的最后两年。 (这在SSRS 2008中进行了测试,可能会有更简单的方法,特别是在以后的版本中)

   select 
        Data,[year],measure,ROW_NUMBER() over (partition by data order by [year] desc) i
    from (values 
    ('hp',2010,14), 
    ('hp',2011,25), 
    ('hp',2012,30),
    ('Dell',2010,17),
    ('Dell',2011,18),
    ('Dell',2012,20)) t (data,year,measure)

 Data        year    measure   i
 hp          2010    14        3
 hp          2011    25        2
 hp          2012    30        1
 Dell        2010    17        3
 Dell        2011    18        2
 Dell        2012    20        1

对数据执行年份和行组的列组。 表达式 SUM(Field!Measure.Value)在2组的交叉单元格上。

在列组后添加列,并将表达式添加到标题单元格

=MAX(iif(Fields!i.Value = 2,Fields!year.Value.ToString(),""))+"/"+ MAX(iif(Fields!i.Value = 1,Fields!year.Value.ToString(),""))

和Cell的下一个表达式

=iif(SUM(iif(Fields!i.Value = 2,Fields!measure.Value,0))=0,0,SUM(iif(Fields!i.Value = 1,Fields!measure.Value,0))-SUM(iif(Fields!i.Value = 2,Fields!measure.Value,0)) / (SUM(iif(Fields!i.Value = 2,Fields!measure.Value,0))*100))

我认为公式是可以的,但它返回的值与您预期发布的值不同。