【问题标题】:Expression to find value for previous year SSRS查找上一年 SSRS 值的表达式
【发布时间】:2015-04-17 09:03: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];

【问题讨论】:

  • 按年旋转查询,然后您就可以应用您的表达方式。
  • 你好,你能解释一下吗
  • 您可以添加您正在使用的 MDX 查询吗?
  • 这个 MDX 查询 SELECT NON EMPTY { [Measures].[Val] } ON COLUMNS,NON EMPTY { ([DimCAT].[lbl].[lbl].ALLMEMBERS * [DimDate].[ Year].[Year].ALLMEMBERS ) } ON ROWS FROM [Data]

标签: sql-server reporting-services mdx


【解决方案1】:

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

【讨论】:

  • 但我的报告在年份参数上运行
  • 好的 - 所以你有 @Yr 等于最后一列中的年份?即@Yr = 2012 ?
  • 好的,所以@yr 可能是 2012 年、2013 年或 2014 年,具体取决于用户选择什么?
  • 正是我没有找到解决方案你怎么能做到这一点,因为我的问题是 ssrs 中的最后一个值我有函数 Last 来获取最后一个值,但最后一个我没有一个函数
【解决方案2】:

如果您有机会更改源数据集,我将使用 UNPIVOTed 年份和 Row_Number on Data 的数据集,按年份降序排列。这样你就可以过滤你想要的过去两年。 (这在 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

并在年份上做一个列组,在数据上做一个行组。 2组相交单元格上的表达式SUM(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 qeury 合作,我正在尝试用 vb.net 编写一个脚本来获取我最后一个先前的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多