汇总值并显示在图表中

时间:2019-02-18 08:56:55

标签: reporting-services ssrs-2008 ssrs-2012 ssrs-2016

我正在为这个问题而苦苦挣扎,我不知道该怎么解决。

这是我的数据集详细数据:

Order  Item    StartDay      EndDay     EndYear  StartEndDiff
 1      1     01.01.2018   02.01.2018    2018         1
 1      2     03.01.2018   05.01.2018    2018         2
 2      1     05.01.2019   06.01.2019    2019         1
 2      2     06.01.2019   06.01.2019    2019         0
 2      3     08.01.2019   10.01.2019    2019         1
 3      1     07.01.2019   08.01.2019    2019         1

我现在按Order对它们进行分组(在tablix中可以正常工作)。群组名称为OrderGroup

Order   MinStartDay   MaxEndDay    EndYear  MinStartMaxEndDiff
 1      01.01.2018    05.01.2018    2018        4
 2      05.01.2019    10.01.2019    2019        5
 3      07.01.2019    08.01.2019    2019        1

对于MinStartMaxEndDiff,我得到以下表达式:

=DateDiff("d", Min(Fields!StartDay.Value, "OrderGroup"), Max(Fields!EndDay.Value, "OrderGroup"))

现在,我在Tablix中添加了另一个组,并按Avg(MinStartMaxEndDiff)显示了EndYear。在所有分组的Tablix中仍然可以正常使用。结果:

Avg(MinStartMaxEnd)    Year
       4               2018
       3               2019

但是我不知道如何基于计算将结果中的数据仅显示在图表中。我通常在SQL端进行这些计算,但是这次我不能在SQL端进行这些计算。

问题是,当我尝试在图表中添加OrderGroup时,它总是向我显示详细信息。但是我需要这个小组来获得正确的价值观。隐藏或将类别标签设置为Nothing无效。同样将DataElementOutput设置为NoOutput并没有帮助(真实外观):

Actual Look

我只需要在x轴上使用Years,并将Avg(MinStartMaxEnd)作为值。根据上面的示例数据,这将是我想要的输出:

Desired Look

找到解决方案后进行编辑:

如果行数据如下所示,该怎么办:

Order  Item    StartDay      EndDay     EndYear  StartEndDiff
 1      1     29.12.2018   02.01.2019    2019         4
 1      2     28.12.2018   30.12.2018    2018         2

由于EndYear分组,因此在Tablix中将这一行分为两个单独的数据行。预期结果应如下所示:

Order   MinStartDay   MaxEndDay    EndYear  MinStartMaxEndDiff
 1      28.12.2018    02.01.2019    2019        5

但是一年中的分组带有表达式

=Max(CDate(Fields!EndYear.Value), "OrderGroup")

是不可能的。

2 个答案:

答案 0 :(得分:1)

这不是一个答案,因为我没有得到您所期望的结果,工作变得很麻烦!但是,它非常接近,所以我认为如果有帮助的话,我会发布它。

在服务器上这样做很可惜,因为这样做很容易。

无论如何,我复制了您的数据集(对字段名进行了一些更改以避免关键字冲突),然后按如下所示设置图表。

类别组-无

系列组2.父组位于“ EndYear”上,称为“ ChartYearGroup”,子组位于OrderID上,称为“ ChartOrderGroup”

值-在这里,我将类别字段设置为[EndYear],表达式为

=AVG(DateDiff(
    "d"
    , Min(Fields!StartDay.Value, "ChartOrderGroup")
    , Max(Fields!EndDay.Value, "ChartOrderGroup")
    )
    , "ChartYearGroup"
    )

这确实给出了正确的数字,但不幸的是,每个订单而不是每年显示。

我不确定这是否可以解决。我以某种方式猜测您必须隐藏订单组或将这两个组合并为一个,我只是没时间测试。

这是最终结果。

enter image description here

答案 1 :(得分:1)

您可以在tablix中使用自定义代码来计算每年的平均值,并在图表中调用计算出的值。

在您的报告中添加以下自定义代码

Public Dim YearAvg As New System.Collections.Generic.Dictionary(Of String , Decimal )

Public Function SetYearAverage( ByVal s As String,  ByVal d AS Decimal) As Decimal
YearAvg.Add(s,d)
Return d

End Function

您可以在文本框中计算年平均值,将表达式更改为以下内容(对字段名称进行适当的更改)

= Code.SetYearAverage(Cstr(Fields!EndYear.Value), Avg ( DateDiff("d", Min(Fields!StartDay.Value,"OrderId"), Max(Fields!EndDay.Value,"OrderId"))))

然后将图表表达式设置为

=   Code.YearAvg( Cstr( Fields!EndYear.Value))

enter image description here

enter image description here