首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSRS计算组的线性趋势

SSRS计算组的线性趋势
EN

Stack Overflow用户
提问于 2018-01-30 17:55:36
回答 1查看 51关注 0票数 0

假设我有一个具有如下值的数据集:

代码语言:javascript
复制
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
...

我需要计算每个列的线性趋势。这意味着我需要在一个组摘要中比较每个值是依次大于还是小于前一个月的值。

我有三个结果需要展示:

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

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

我试图使用RunningValue函数以一种基本的形式来跟踪它,以便使用自定义代码将"+“、"-”或"=“填充到连接字符串中。我遇到的问题是,我试图轮询多列的结果,并试图将每个计算连接到一个字符串中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-30 19:48:07

这可能不是最好的方法,但这是第一个突然出现在我脑海中的解决方案,并且起作用了,至少对我测试过的数据集是这样的。首先,我使用的整个表达式:

代码语言:javascript
复制
=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或总是<= 0)

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

Switch的第一部分是检查差异是否为all = 0,这意味着值在几个月之间根本没有变化。我将此包括在"+-"/"↔“一案中。

Switch的下一部分是检查是否所有的差异都是正的。我们得到了这个表达式的这一部分的区别:

代码语言:javascript
复制
Fields!A.Value - Lookup(DateAdd("m", -1, Fields!Date.Value), Fields!Date.Value, Fields!A.Value, "DataSet3")

我们正在检查这个差异是否是>= 0。但我们也需要确保忽略第一个月:没有前一个月进行比较。

代码语言:javascript
复制
AND Fields!Date.Value <> Min(Fields!Date.Value)

然后,我们检查这个计数是否等于月数减去1:

代码语言:javascript
复制
DateDiff("m", Min(Fields!Date.Value, Max(Fields!Date.Value))

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

切换的下一个条件只是检查趋势是否总是<= 0,与第一部分相同。

然后,如果前三个条件都不满足,我们就会到达交换机(true)的“否则”,这将表明趋势是来回的。

通过使用示例数据集和上面的表达式进行测试,我得出了以下结论:

代码语言:javascript
复制
+--------------------------------------+
| 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   | +   | +-  | +-  | -   | +-  |
+--------------------------------------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48527668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档