SSRS 报表, 行转列后 列汇总数据不准确问题的分享

0
首先数据库里有一行数据,该行数据其中一列是 XML类型, 保存的数据类似以下结构:

现在要生成如下记录集,也就是一对多(2张截图其实是一张图,中间的列太多分开截屏了,合起来看 数据时从2月到6月 5条记录):

然后将此记录集,到SSRS进行 行转列:

当需要对数据进行总汇总的时候,问题出现了(F列 G列):

为什么地下的汇总会不正确呢? 它把所有的行都累加了一遍,当然这是不符合我们要求的。
因为我们行专列之前,其实只有一条记录,只是该条记录的xml列里有多个xml行。然后我们将xml行拉平,变成了5行。 然后到报表的时候,将该5行记录进行 行转列。 其实这5行是一条记录,因此只需要计算一次就行。

解决办法:
  1. 如果是 SSRS2008R2以上(RDLC不支持),请使用如下表达式在最下面汇总的Cell里:
=SUM(MIN(Fields!FiledsName.Value,"Group name"))

  1. 如果你是RDLC或者2008R2以下,请使用如下方式:
Dim Aggregation as Decimal = 0

Dim AggregationCapacityBefore As Decimal = 0

Function AddValue(ByVal NewValue As Decimal, ByVal VarName As String) As Decimal
If VarName = "CapacityBefore" Then
AggregationCapacityBefore = AggregationCapacityBefore + NewValue
End If
Return NewValue
End Function

Function GetAggregation(ByVal VarName As String) As Object
If VarName = "CapacityBefore" Then
Return AggregationCapacityBefore
Else : Return 0
End If
End Function

普通行里用如下表达式:
=CODE.AddValue(MIN(Fields!CapacityBeforeMaintenance.Value), "CapacityBefore")
汇总行里用:
=CODE.GetAggregation("CapacityBefore")

结论:
其实办法很简单,就是用一个变量暂时保存该列的所有行的汇总值,不是所有行。
然后在总的行里把该值取出来。
不得不吐槽, 微软报表弱的一塌糊涂。

已邀请:
0

梁勇 - 天道酬勤、上善若水。爱好商业智能 2014-06-30 回答

搞的不错,赞一个,下次可以写成文章的呢。。

1.jpg
0

天桥下的郑成功 - Hadoop大数据开发工程师、数仓架构师、熟悉数据仓库设计、Hadoop、Spark、HBase、Hive、SSIS等开发 2014-07-01 回答

多谢梁总提醒, 应该可以从 提问转成文章来着。
没有这个功能吗?

要回复问题请先登录注册