【问题标题】:SQL Server Reporting: How calculate value based on the previous calculated value int the same column?SQL Server Reporting:如何根据先前计算的值在同一列中计算值?
【发布时间】:2019-07-18 07:40:48
【问题描述】:

我正在尝试根据报表表达式中同一列中的前一行值计算行值。我无法从数据库中预先计算这一点,因为计算的起点取决于输入参数,并且表中的值应在报告本身内动态重新计算。

在 Excel 中类比数据和公式如下图所示(起点始终为 100):

   B      C             D            E
   Price  PreviousPrice CalcValue    Formula
1  NULL   NULL          100 
2  2.6    2.5           104          B2/C2*D1
3  2.55   2.6           102          B3/C3*D2
4  2.6    2.55          104          B4/C4*D3
5  2.625  2.6           105          B5/C5*D4
6  2.65   2.625         106          B6/C6*D5
7  2.675  2.65          107          B7/C7*D6

我试图计算期望值(“CalcValue”是设置表达式的列的名称),如下所示:

=Fields!Price.Value/ PreviousPrice.Value * Previous(reportitems("CalcValue").Value))

但出现错误“聚合函数只能用于页眉和页脚中包含的报表项”

您能否建议在我的情况下是否可以实现预期结果并提出解决方案?

提前谢谢你!

遗憾的是,我仍然面临问题:计算列不考虑以前的计算值。例如,我添加了默认为 100 的 CalcVal 字段,并尝试使用上述方法进行计算,例如:=previous(runningValue(Fields!CalcVal.Value, sum, "DataSet1") ) * Fields!Price.Value/Fields!PreviousPrice.Value.

但在这种情况下,它总是将 Fields!Price.Value/Fields!PreviousPrice.Value 乘以 100.. 例如 CalcVal on Fly 总是显示 200 =previous(runningValue(Fields!CalcVal.Value, sum, "DataSet1")) * 2

https://imgur.com/Wtg3Wsg

【问题讨论】:

    标签: expression calculated-field ssrs-2016 reporting-services-2016


    【解决方案1】:

    我尝试了您的示例数据,这是我取得结果的方式

    要使用的公式,您可能需要注意空值

      =Fields!Price.Value/(Fields!PreviousPrice.Value*Previous(Fields!CalcValue.Value))
    

    编辑:在 Op 的评论后更新以回答

    CalcValue 使用以下公式计算,即即时计算

    =RunningValue(CountDistinct("Tablix6"),Count,"Tablix6"*100
    

    然后是下面的最终值

    =Fields!Price.Value/(Fields!PreviousPrice.Value*
    Previous(RunningValue(CountDistinct("Tablix6"),Count,"Tablix6"))*100)
    

    【讨论】:

    • 不幸的是,它对我不起作用:在这种情况下,问题是 CalcValue 不是数据集的列,并且最初没有值(必须从 100 作为目标即时计算列)
    • 啊,还是不用担心,正如您所说,CalcValue 是即时计算的,只需从我的公式中输入该公式而不是 Field!CalcValue.Value。注意:您需要之前的 CalcValue 值进行计算,因此必须调整公式。
    • 感谢 AnkUser 的努力!但 CalcValue 不应该只是累积 100(默认情况下,100 仅用于第一行);每次需要根据之前计算的值更改该值;请查看我原始消息中的公式示例以查看预期的计算逻辑
    • 我刚刚使用了示例数据来展示您可以执行 B2/C2*D1 等公式。您现在知道如何获得正确的计算,即使您的 CalcValue 是动态生成的。使用这个想法来生成你的结果
    • 遗憾的是我仍然面临问题:计算列不考虑以前的计算值。例如,我添加了 CalcVal 字段,默认值为 100,并尝试使用上述方法进行计算,例如: =previous(runningValue(Fields!CalcVal.Value, sum, "DataSet1") ) * Fields!Price.Value/Fields!PreviousPrice.Value .但在这种情况下,它总是将 Fields!Price.Value/Fields!PreviousPrice.Value 乘以 100.. 例如 CalcVal on Fly 总是显示 200 = previous(runningValue(Fields!CalcVal.Value, sum, "DataSet1")) * 2 imgur.com/Wtg3Wsg 抱歉格式错误..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多