SSRS计算群体的线性趋势

时间:2018-01-30 17:55:36

标签: reporting-services aggregates

假设我的数据集的值如下:

Date      A        B        C        D
1/1/2017  0.67     0.87     0.34     0.77
2/1/2017  0.76     0.76     0.55     0.70
3/1/2017  0.83     0.83     0.56     0.67
4/1/2017  0.90     0.79     0.49     0.67
...

我需要计算每列的线性趋势。含义我需要在组摘要中比较每个值是按顺序大于还是小于上个月的值。

我需要显示三个结果:

  • 趋势是↑(每个数字大于或等于前几个月。)
  • 趋势是↓(每个数字小于或等于前几个月。)
  • 趋势是all(所有其他情况。)

使用示例数据集,A列为↑,D列为↓,所有其他列为↔。我需要能够在每个列的组摘要中跟踪它。

我尝试使用RunningValue函数以初步形式跟踪这个,使用自定义代码将“+”,“ - ”或“=”填充到连接字符串。我遇到这个问题的问题是,我正在尝试将这些结果轮询到多个列,并尝试将每个计算连接到一个字符串。

1 个答案:

答案 0 :(得分:0)

这可能不是最好的方法,但它是第一个突然出现并且工作的解决方案,至少对于我测试的数据集而言。首先,我使用的整个表达式:

=Switch(
    Sum(
        IIf(
            Fields!E.Value - Lookup(DateAdd("m", -1, Fields!Date.Value), Fields!Date.Value, Fields!E.Value, "DataSet3") = 0 AND Fields!Date.Value <> Min(Fields!Date.Value),
            1,
            0
        )
    ) = DateDiff("m", Min(Fields!Date.Value), Max(Fields!Date.Value)), "+-",
    Sum(
        IIf(
            Fields!E.Value - Lookup(DateAdd("m", -1, Fields!Date.Value), Fields!Date.Value, Fields!E.Value, "DataSet3") >= 0 AND Fields!Date.Value <> Min(Fields!Date.Value),
            1,
            0
        )
    ) = DateDiff("m", Min(Fields!Date.Value), Max(Fields!Date.Value)), "+",
    Sum(
        IIf(
            Fields!E.Value - Lookup(DateAdd("m", -1, Fields!Date.Value), Fields!Date.Value, Fields!E.Value, "DataSet3") <= 0 AND Fields!Date.Value <> Min(Fields!Date.Value),
            1,
            0
        )
    ) = DateDiff("m", Min(Fields!Date.Value), Max(Fields!Date.Value)), "-",
    true, "+-"
)

基本上是这样的:Switch语句检查月份之间的正差异或负差异的计数是否与月份减去1的数量相同(换句话说,如果趋势总是> = 0或始终&lt; = 0)

我们在这里使用Sum(IIf(作为临时CountIf,因为SSRS没有CountIf`函数。

Switch的第一部分是检查差异是否全部= 0,这意味着数值在几个月之间根本没有变化。我把它包括在&#34; + - &#34; /&#34;↔&#34;情况下。

Switch的下一部分是检查差异是否都是积极的。我们对表达式的这一部分有所不同:

Fields!A.Value - Lookup(DateAdd("m", -1, Fields!Date.Value), Fields!Date.Value, Fields!A.Value, "DataSet3")

我们正在检查该差异是否> = 0.但我们还需要确保忽略第一个月:没有上个月比较它。

AND Fields!Date.Value <> Min(Fields!Date.Value)

然后检查此计数是否等于月数减一:

DateDiff("m", Min(Fields!Date.Value, Max(Fields!Date.Value))

对于给定的样本数据集,这当然会返回3,这就是我们想要的。如果这两个值相等,则该列的趋势始终为> = 0。

交换机的下一个条件是检查趋势是否总是&lt; = 0,与第一部分相同。

如果前三个条件都没有达到,我们就会到达&#34;否则&#34;开关(true),表示趋势来回。

使用您的样本数据集和上面的表达式进行测试,我得出以下结论:

+--------------------------------------+
| Date   | A   | B   | C   | D   | E   |
|1/1/2017| 0.67| 0.87| 0.34| 0.77| 0.50|
|2/1/2017| 0.76| 0.76| 0.55| 0.70| 0.50|
|3/1/2017| 0.83| 0.83| 0.56| 0.67| 0.50|
|4/1/2017| 0.90| 0.79| 0.49| 0.67| 0.50|
|Trend   | +   | +-  | +-  | -   | +-  |
+--------------------------------------+