如何减去s-s-rs矩阵中的相邻列

Posted

技术标签:

【中文标题】如何减去s-s-rs矩阵中的相邻列【英文标题】:how to subtract adjacent columns in an s-s-rs matrix 【发布时间】:2013-11-27 16:17:13 【问题描述】:

我有一个 s-s-rs 矩阵,如下所示:

               Month(Columns)
   Product(Rows)  Sales(Data)

输出看起来像这样:

                       June  July  August  Sept  Oct  
          ABC          34     34     23     22    67
          DEF          33     21     32     22    14

我想要一个如下所示的输出:

                       June  July  June-July  Aug  July-Aug  Sept  Aug-Sept  Oct  Sept-Oct
              ABC        34   34      0        23     11      22      1       67     45
              DEF        33   21      12       32     11      22      10      14     8

我试着做这样的事情:

                Month(Columns) Change
   Product(Rows)  Sales(Data)   Expression

表达式看起来像这样:

=Sum(IIF(Fields!MONTH.Value=Fields!MONTH.Value,Fields!Products.Value,Nothing))-
Sum(IIF(Fields!MONTH.Value=Fields!MONTH.Value - 1,Fields!Products.Value,Nothing))

但它不起作用。我想看到如上所示的输出。请告诉我。



嘿,山姆,

使用您提到的解决方案:

我看到这样的输出:

                       June   Garbage    July  July-June  Aug  Aug-Jul  
              ABC        34     xx        34      0        23     11    
              DEF        33     xx        21      12       32     11    

有没有办法可以删除带有垃圾值的列?

嘿山姆,我试过你的代码。现在我在整个列上有一个很大的空白区域。有没有办法也可以隐藏广阔的空间?

【问题讨论】:

嘿,我收到一条错误消息:在外部聚合中使用先前的函数。以前的函数不能指定为嵌套聚合。我的表达是这样的: =Sum(IIF(Fields!MONTH.Value=Fields!MONTH.Value,Fields!Products.Value,Nothing))- Sum(IIF(Fields!MONTH.Value=Previous(Fields!MONTH. Value),Fields!Products.Value,Nothing)) 垃圾值到底是什么?如果您按数据集中的列进行分组,那么该列必须与该数据相关?你检查过你的原始数据吗? 问题是,我实际上想隐藏垃圾列。因为它可能正在执行 June-May ,但 May 没有显示在我的报告中。因此,如果有任何方法,我想隐藏该列。我只想隐藏计算差异的第一列?问题清楚了吗? 如何在数据集中设置日期范围?你有用户选择的日期参数吗? 嗯..当然让我试试!谢谢 ! +1 并标记为答案 【参考方案1】:

如果您按月对列进行分组,则不需要使用 SumIif

您可以使用诸如=Sum(Fields!Products.Value) 之类的表达式来获取该特定月份中所有产品的总和。如果您想查看当前月份和上个月之间的差异,那么如果您在月份列组内的单元格中输入以下表达式...

=Iif(Previous(Fields!MONTH.Value) = Nothing, 0, 
Sum(Fields!Products.Value) - Previous(Sum(Fields!Products.Value)))

您需要在这种情况下进行空检查,因为第一个月不会返回任何内容。

如果您有重叠的行和列行组(我相信您会这样做),那么您将无法使用 Previous,因为它不受支持 :-(


我认为唯一的解决方案是使用一些自定义代码。

有一个链接here

Public Shared previous as Integer
Public Shared current as Integer
  Public Shared Function GetCurrent(Item as Integer) as Integer
     previous=current
     current=Item
     return current
  End Function

  Public Shared Function GetPrevious()
     return previous
  End Function

那么你的用法会像

=Code.GetCurrent(Sum(Fields!Products.Value)) - Code.GetPrevious()

【讨论】:

嘿山姆!非常感谢你试图帮助我。当我使用以下表达式时,我收到错误消息“不支持在 Tablix 'xyz' 内的 TablixCell 中使用 Previous 聚合函数”我认为导致错误的原因是 Previous(Fields!MONTH.Value) = Nothing,0 嘿山姆!有了最新的补充,我想我们就快到了。但是你能告诉我如何在这里检查第一个月,因为第一个月没有前一个月? 您可以尝试将之前设置为初始值Public Shared previous as Integer = -666,然后您可以检查该值,即。 =iif(Code.GetPrevious() = -666,0,Code.GetCurrent(Sum(Fields!Products.Value)) - Code.GetPrevious())我没有测试过,但我不明白为什么它不起作用。 嘿,我尝试了上述解决方案,但我仍然看到输出包含一列不需要的值。我已经更新了我在问题中看到的内容。你能告诉我如何使用垃圾值来处理列吗? 你看到了什么输出?【参考方案2】:

我找到了一种方法,通过添加列分组名称,使用“previous”函数计算 Matrix 列之间的差异。

=Previous(Sum(Fields!AMOUNT.Value),"PeriodGroupName")

查看此处了解更多详细信息。 http://www.tricks-and-tips.nl/tips-and-tricks/sql/s-s-rs/s-s-rs-matrix-compare-column-values 这里是文档。 https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms156372(v=sql.105)

【讨论】:

如果您不确定,请作为评论再次询问或尝试找到更好的解决方案,以便 100% 确定。请阅读规则。 @dpap,对不起,我已经阅读了很多回复“你没有理解这个问题......”所以礼貌。

以上是关于如何减去s-s-rs矩阵中的相邻列的主要内容,如果未能解决你的问题,请参考以下文章

将列中的 NA 替换为相邻列中的值

SQL Server:减去相邻列分组

如何使 s-s-rs 矩阵中的列不可见

如何从 Pandas 数据框列中的日期时间减去 3 小时?

如何将文本框添加到 s-s-rS 项目中的现有矩阵?

如何隐藏矩阵列?