SSRS 计算组的线性趋势
SSRS calculating linear trends for groups
假设我有一个具有如下值的数据集:
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 函数以基本形式跟踪此问题,以使用自定义代码将“+”、“-”或“=”填充到连接的字符串中。我 运行 遇到这个问题的地方是我试图为多列轮询这些结果,它试图将每个计算连接到一个字符串。
这可能不是执行此操作的最佳方法,但它是第一个突然出现在我脑海中并起作用的解决方案,至少对于我测试的数据集而言是这样。首先,我使用的整个表达式:
=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
语句检查月份之间的正差或负差的计数是否等于月数减一(换句话说,如果趋势总是>= 0 或始终 <= 0)
我们在这里使用 Sum(IIf(
作为权宜之计 CountIf
因为 SSRS 没有 CountIf` 函数。
Switch
的第一部分检查差异是否全部 = 0,这意味着这些值在几个月之间根本没有变化。我将其包含在“+-”/“↔”案例中。
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))
对于给定的示例数据集,这当然会 return 3 这就是我们想要的。如果这两个值相等,则该列的趋势始终 >= 0。
开关的下一个条件只是检查趋势是否总是<= 0,与第一部分相同。
然后如果满足前三个条件中的none,我们就到达开关的"else"(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 | + | +- | +- | - | +- |
+--------------------------------------+
假设我有一个具有如下值的数据集:
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 函数以基本形式跟踪此问题,以使用自定义代码将“+”、“-”或“=”填充到连接的字符串中。我 运行 遇到这个问题的地方是我试图为多列轮询这些结果,它试图将每个计算连接到一个字符串。
这可能不是执行此操作的最佳方法,但它是第一个突然出现在我脑海中并起作用的解决方案,至少对于我测试的数据集而言是这样。首先,我使用的整个表达式:
=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
语句检查月份之间的正差或负差的计数是否等于月数减一(换句话说,如果趋势总是>= 0 或始终 <= 0)
我们在这里使用 Sum(IIf(
作为权宜之计 CountIf
因为 SSRS 没有 CountIf` 函数。
Switch
的第一部分检查差异是否全部 = 0,这意味着这些值在几个月之间根本没有变化。我将其包含在“+-”/“↔”案例中。
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))
对于给定的示例数据集,这当然会 return 3 这就是我们想要的。如果这两个值相等,则该列的趋势始终 >= 0。
开关的下一个条件只是检查趋势是否总是<= 0,与第一部分相同。
然后如果满足前三个条件中的none,我们就到达开关的"else"(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 | + | +- | +- | - | +- |
+--------------------------------------+