Sql server 用于查找上一年SSR值的表达式

Sql server 用于查找上一年SSR值的表达式,sql-server,reporting-services,mdx,Sql Server,Reporting Services,Mdx,我需要一些表达式方面的帮助。我需要一个报告,显示本年度以及上一年度关于此规则表达式的字段计算(Last Last previous)/Last previous*100。此外,该报告还以年份参数运行。 下面是结果的示例 例如,我选择了2010年、2011年和2012年 year Data 2010 2011 2012 hp 14 25 30 Dell 17 18 20

我需要一些表达式方面的帮助。我需要一个报告,显示本年度以及上一年度关于此规则表达式的字段计算(Last Last previous)/Last previous*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];

如果您有机会更改源数据集,我将使用未指定年份的数据集,并且数据上的行数按年份降序排列。这样你就可以过滤你想要的最后两年。 (这是在SSRS 2008中测试的,可能有更简单的方法,尤其是在以后的版本中)

并对年份进行列分组,对数据进行行分组。 两组相交单元格上的表达式和(Field!Measure.Value)

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

=MAX(iif(Fields!i.Value = 2,Fields!year.Value.ToString(),""))+"/"+ MAX(iif(Fields!i.Value = 1,Fields!year.Value.ToString(),""))
细胞的下一个表达

=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))

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

通过
mdx
您需要使用
WITH
子句。
添加的
计算成员
称为
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];
使用
stroset
功能,您可以使用以下参数获得单个成员集:

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]; 

按年份旋转查询,然后您就可以应用表达式了。您好,您能解释更多吗?您能添加您正在使用的MDX查询吗?这是MDX查询在列上选择非空{[Measures].[Val]},在[Data]的行上选择非空{([DimCAT].[lbl].[lbl].ALLMEMBERS*[DimDate].[Year].[Year].[ALLMEMBERS]}感谢您的回答,但我使用mdx qeury,我正在尝试使用vb.net编写一个脚本,以获取上一个值,但我的报告在年份参数上运行OK-那么您有
@Yr
,它等于最后一列中的年份?i、 e.
@Yr
=
2012
?好的,那么@Yr可能是2012年、2013年或2014年,这取决于用户选择什么?确切地说,我没有找到解决方案,你怎么能这样做,因为我的问题是ssrs中的上一个值我有函数last来获取上一个值,但上一个我没有函数
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];